python - 如何检查文件夹中的文件是否与 .csv 文件中指定的文件名一致?

标签 python csv file

我正在尝试构建一种方法来检查我的 .csv 文件中的文件名是否与我的实际文件夹中的文件名匹配。如果它们不匹配,我想删除 .csv 文件中的整行。到目前为止,这是我尝试过的:

dir_path = Path('D:\audio_files')
    
csv_file_path = Path('D:\metadata.csv') 

lines = list()
files = list()

for f in os.listdir(dir_path):
    f = f.strip('.wav')
    files.append(str(f))

with open(csv_file_path, 'r') as read_file:
    reader = csv.reader(read_file)
    for row in reader:
        lines.append(row)
        for field in row:
            for f in files:
                if field != f:
                    print("Line Removed.")
                    lines.remove(row)

但是,我不断收到此错误:

Traceback (most recent call last):
File "file_checker.py", line 26, in <module>
lines.remove(row)
ValueError: list.remove(x): x not in list

我应该修复什么才能使其正常工作?

编辑:

这是我的 .csv 文件的一个小样本。这非常简单。第一列包含不带扩展名的文件名,第二列包含文件名的标签。

<表类="s-表"> <头> fname 标签 <正文> 236421 男性语音 124818 女性语音 426906 男性语音

等等。

我主要是尝试将 fname 列中的名称与我的文件夹(扩展名为 .wav)中的名称相匹配,如果这些名称不存在于文件夹,删除不存在的文件名行。

编辑#2:

在本地的帮助下,我设法解决了这个问题。这是最终产品:

dir_path = 'D:\audio'

csv_file_path = 'D:\original.csv'

#create a new file that contains the fnames on the cvs file that match the file names in my file folder
csv_new_file = open('D:\new.csv', 'w', newline="")

# create a writer variable that will allow me to write rows in my new csv file
csv_write = csv.writer(csv_new_file, delimiter=',', quotechar='"')

# "i" variable will allow me to write the headers from the original csv file
i = 0
with open(csv_file_path, 'r') as read_file:
    reader = csv.reader(read_file, delimiter=',', quotechar='"')
    for row in reader:
#If the row is the very first, the write it as is (headers)
        if i == 0:
            csv_write.writerow(row)  
            i += 1
            continue
#Check if the file path for my audio files with .wav extension exists and the write the row of the original csv in my new csv
        file_path = dir_path + '/' + row[0] + '.wav'
        if os.path.exists(file_path):
            csv_write.writerow(row)

#IMPORTANT to close files once finished!
csv_new_file.close()
read_file.close()

最佳答案

考虑这个 block :

for f in files:
    if field != f:
        lines.remove(row)

也就是说,如果 field 的值不等于 f 的值,则将其删除。如果 files 是一个文件列表,除非列表中的第一个元素与字段的值匹配,否则它将被删除,并且在该元素被删除后迭代将继续。

相反,我建议将文件设置为集合并检查集合中的成员

dir_path = Path('D:\audio_files')
    
csv_file_path = Path('D:\metadata.csv') 

lines = list()
files = set()

for f in os.listdir(dir_path):
    f = f.strip('.wav')
    files.add(str(f))

with open(csv_file_path, 'r') as read_file:
    reader = csv.reader(read_file)
    for row in reader:
        lines.append(row)
        for field in row:
            if field not in files:
                lines.remove(row)
                continue

我个人会将这些循环拆分并构建行列表,然后迭代删除元素的副本,但这可能只是个人喜好。

关于python - 如何检查文件夹中的文件是否与 .csv 文件中指定的文件名一致?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66072612/

相关文章:

python - 如何在 ubuntu 上更改 conda 基本环境路径?

java - 如何使用Java检查数据是否写入csv文件?

python - Pandas 导出到 csv

python - 将 OLS 回归摘要打印到文本文件

python - BeautifulSoup 使用 python 删除除白名单中的所有 html 标签,例如 "img"和 "a"标签

python - 按一天中的时间分组数据

python - 替换 beautifulsoup 中的 <p> 和 <br> 标签

android - 将数据库文件复制到android中的sdcard

java - 如何阅读管道分隔线 |来自一个文件并在两个不同的 ArrayList 中拆分整数

java - 文件锁定和删除