Python 如何检查文件夹中的文件是否与.csv文件中指定的文件名一致?
我正在尝试构建一个方法,该方法将检查.csv文件中的文件名是否与实际文件夹中的文件名匹配。如果它们不匹配,我想删除.csv文件中的整行。以下是我迄今为止所尝试的:Python 如何检查文件夹中的文件是否与.csv文件中指定的文件名一致?,python,csv,file,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')
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
回溯(最近一次呼叫最后一次):
文件“File_checker.py”,第26行,在
行。删除(行)
ValueError:list。删除(x):x不在列表中
我应该修什么才能让它工作
编辑:
这是我的.csv文件的一个小示例。这很直截了当。第一列包含不带扩展名的文件名,第二列包含文件名的标签
文件名
标签
236421
男声
124818
女性演讲
426906
男声
考虑一下这一块:
对于文件中的f:
如果是字段!=f:
行。删除(行)
也就是说,如果field的值不等于f的值,就删除它。如果文件是一个文件列表,除非列表中的第一个元素与字段值匹配,否则它将被删除,并且在该元素被删除后,迭代将继续
相反,我建议将文件设置为集合,并检查集合中的成员身份
dir\u path=path('D:\audio\u files')
csv\u file\u path=path('D:\metadata.csv')
行=列表()
files=set()
对于os.listdir(目录路径)中的f:
f=f.strip(“.wav”)
文件。添加(str(f))
打开(csv文件路径,'r')作为读取文件:
reader=csv.reader(读取文件)
对于读取器中的行:
行。追加(行)
对于第行中的字段:
如果字段不在文件中:
行。删除(行)
持续
我个人会将这些循环拆分,并建立行列表,然后在副本上迭代删除元素,但这可能只是个人喜好。错误是正确的,因为您在每行的字段中循环,当字段与文件名不匹配时,代码会多次尝试删除该行。第一次删除成功,但后续尝试失败。您能在问题中粘贴您的metadata.csv示例吗?@jrd1我明白了。你是在建议我删除循环之外的行,循环遍历csv文件中的字段吗?@JazminCristina:是的;您可以有一个变量(例如找到的
),用于跟踪文件名是否在行的字段中,即在行的正下方。在第一次编辑时追加(行)
。如果在行
中找到字段值,则可以将其设置为默认值False
,并将其设置为True
。因此,在循环行的字段之后,您可以检查found
是否为True,并从行
变量中删除该行,然后将found重置为False
。这种想法的一种变体是,仅当根据前面的建议找到字段时才添加行,这将有效地产生相同的结果。如果同一行的多个字段
不在文件中
,这将抛出相同的错误。我建议在行之后添加一个continue
。删除(行)
@MitchellOlislagers完全正确,已修复。这更接近我想要的,只是不完全正确。我测试了建议的更改,同样的错误不断出现。也许我应该删除for循环之外的行?