我正在以下代码中寻求帮助,可以从给定的csv文件中不可用的文件夹中删除文件。 我读取了熊猫数据框中的输入文件,并将其转换为列表,然后 从文件夹中读取文件名,并将文件名与文件夹中的可用文件进行比较,如果存在,则继续操作(如果未删除)。但是它将删除所有文件,包括不匹配的文件。
我只想删除使用熊猫数据框读取的文件中不存在的文件。
import os
import pandas as pd
path = "Adwords/"
flist = pd.read_csv('C:/mediaops/mapping/adword/file_name.csv')
file_name = flist['fileName'].tolist()
for filename in os.listdir(path):
print(filename)
if filename == file_name:
continue
elif filename != file_name:
os.remove(filename)
答案 0 :(得分:2)
在原始解决方案中,您尝试执行filename == file_name
和filename != file_name
,但是您不能这样做。
请参见filename
是string
,而file_name
是列表,您不能使用==
进行比较,需要使用membership
运算符,例如in
和not in
,就像我在下面的答案中所做的if filename not in file_name:
(感谢Tobias's Answer)
现在,由于该窗口不在窗口中,因此您现在可以使用os.listdir遍历所有文件,然后使用os.remove删除必要的文件,此外还可以使用os.path.join来获取文件的完整路径!
import os
#List all files in path
for filename in os.listdir(path):
#If file is not present in list
if filename not in file_name:
#Get full path of file and remove it
full_file_path = os.path.join(path, filename)
os.remove(filename)
答案 1 :(得分:2)
问题在于file_name
是一个list
if字符串,而filename
是一个字符串,因此支票filename != file_name
会总是为true,因此文件总是被删除。而是使用in
和not in
检查字符串是否在字符串列表中。另外,使用set
会更快。另外,这些变量名称确实很容易混淆。
set_of_files = set(file_name)
for filename in os.listdir(path):
if filename not in set_of_files:
os.remove(filename)
此外,如Devesh's answer中所述,您可能必须join
路径的文件名才能真正删除文件。
答案 2 :(得分:1)
for filename in os.listdir(path):
print(filename)
if filename not in file_name:
os.remove(filename)
答案 3 :(得分:0)
当我实现这些答案时,它删除了目录中的所有文件,而不是我的列表中。所以我为可能需要这个脚本的任何疲惫的旅行者写了一个。用户需要添加他们的文件所在的路径,并使用他们想要保留的文件的基本名称制作一个 csvfile。您还可以添加您想查看的文件的扩展名,如果它们碰巧都一样。
该过程是根据第一列中的每个元素将 csv 制作成一个列表,然后检查当前目录中的文件是否存在于列表中。如果不是,则删除。
import os
import csv
import argparse
import sys
import pathlib
data_path = path = "/path/to/your/dir"
csv_guide = "filenamestokeep.csv"
csv_path = os.path.join(data_path, csv_guide)
ext = "input.your.extention.of.files.to.look.at.as.ext, like .txt"
with open(csv_path, 'r') as csvfile:
good_files = []
for n in csv.reader(csvfile):
if len(n) > 0: good_files.append(n[0])
print(good_files)
all_files = os.listdir(data_path)
for filename in all_files:
if filename.endswith(ext) and filename not in good_files:
print(filename)
full_file_path = os.path.join(data_path, filename)
print("File to delete: {} ".format(filename))
os.remove(full_file_path)
else:
print(f"Ignored -- {filename}")