Python从文件夹中删除不在列表中的文件

时间:2019-05-03 10:28:27

标签: python

我正在以下代码中寻求帮助,可以从给定的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)

4 个答案:

答案 0 :(得分:2)

在原始解决方案中,您尝试执行filename == file_namefilename != file_name,但是您不能这样做。

请参见filenamestring,而file_name是列表,您不能使用==进行比较,需要使用membership运算符,例如innot 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,因此文件总是被删除。而是使用innot 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}")