使用 python 中的 csv 文件从目录中删除文件

Deleting files from a directory using a csv file in python

我想使用 .csv 文件从多个文件夹中删除文件。 csv 文件包含需要删除的文件名列表(例如:Box4、60012-01)。数据的存储方式是在多个文件夹中,并且还有其他扩展名(例如:/tiles_20X_299/Box20/660491-3_mag20_xpos5980_ypos6279.jpg。有没有办法删除这些文件。非常感谢帮助。 这是我到目前为止所拥有的,但不确定我是否朝着正确的方向前进。 [要删除的 csv 文件示例][1]

fin = open('files_to_delete.csv', 'r')
fin.readline()
print(fin)
file_to_delete = set()
while True:
    line = fin.readline().strip()
    #print(line)
    if not line:
        break
    array = line.split(',')
    file_to_delete.add("Box" + array[0] + "/" + array[1])
fin.close()
print(file_to_delete)
#
for path in glob.glob('/home/sshah/Tiles/tiles_20X_299/*'):
    for f in file_to_delete:
        print(f)
        os.chdir(path)
        #print(path)
        if os.path.exists(f):
            print('delete')
            #os.remove(f)```


  [1]: https://i.stack.imgur.com/dFCxk.png

你的方向绝对正确。

假设您 运行 至少是 Python 的 3.5 版,您可以使用 glob.iglob() 递归遍历每个子目录中的每个文件。

我调整了您的代码,使其更符合 Python 风格。

一些具体的变化:

  • file_to_delete set 重命名为 files_to_delete 因为它包含多个文件并且应该是复数。

  • 文件对象上下文管理器使用了with语句以避免担心异常并显式调用 .close().

  • 循环 fin 获取每一行而不显式调用 .readline().

  • 使用 os.path.sep 而不是硬编码 /

  • 删除了不必要的 os.chdir(path)os.path.exists(f) 调用。

它的工作原理是遍历每个子目录中的每个文件(这为我们提供了 str 的完整文件路径),然后我们遍历 files_to_delete set 以检查是否每个file_to_deletefilepath 的子串。如果是,则删除该文件,然后 break 退出该循环以继续下一个文件路径。

如果您知道没有其他具有相似基数的文件名,您可以取消注释此行:files_to_delete.remove(file_to_delete)。例如,如果您有一个名为:

的文件

/tiles_20X_299/Box20/660491-3_mag20_xpos5980_ypos6279.jpg

但不是另一个叫:

/tiles_20X_299/Box20/660491-3_mag10_xpos2000_ypos4000.jpg

为了安全起见,请将其注释掉。

import glob, os

files_to_delete = set()

with open('files_to_delete.csv', 'r') as fin:
    fin.readline() # Consume header
    for line in fin:
        line = line.strip()
        if line:
            files_to_delete.add('Box' + line.replace(',', os.path.sep)) # Assume none of the files contain a comma

print(files_to_delete)

for filepath in glob.iglob(r'/home/sshah/Tiles/tiles_20X_299/**/*', recursive=True):
    for file_to_delete in files_to_delete:
        if file_to_delete in filepath:
            print('Delete:', filepath)
            #os.remove(filepath)
            #files_to_delete.remove(file_to_delete)
            break