我正在尝试构建一种方法来检查我的 .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 文件的一个小样本。这非常简单。第一列包含不带扩展名的文件名,第二列包含文件名的标签。
等等。
我主要是尝试将 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/