Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/290.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何检查文件夹中的文件是否与.csv文件中指定的文件名一致?_Python_Csv_File - Fatal编程技术网

Python 如何检查文件夹中的文件是否与.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')

我正在尝试构建一个方法,该方法将检查.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
回溯(最近一次呼叫最后一次):
文件“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循环之外的行?