Python从文本文件列表中删除目录中的文件

时间:2018-10-11 04:38:11

标签: python python-3.x

我已经搜索了许多有关根据某些参数删除多个文件(例如所有txt文件)的答案。不幸的是,我还没有看到有人将冗长的文件列表保存到.txt(或.csv)文件,并希望使用该列表从工作目录中删除文件的任何事情。

我将当前工作目录设置为.txt文件所在的位置(文本文件以及要删除的文件列表,每行一个),以及〜4000个.xlsx文件。在xlsx文件中,有约3000个我要删除(在.txt文件中列出)。

这是我到目前为止所做的:

import os
path = "c:\\Users\\SFMe\\Desktop\\DeleteFolder"
os.chdir(path)
list = open('DeleteFiles.txt')
for f in list:
   os.remove(f)

这给了我错误:

OSError: [WinError 123] The filename, directory name, or volume label syntax is incorrect: 'Test1.xlsx\n'

我觉得我缺少一些简单的东西。任何帮助将不胜感激!

谢谢

2 个答案:

答案 0 :(得分:4)

  1. 从文本文件读取的每一行以'\n'结尾的条带;
  2. 通过将path与文件名连接起来来获得绝对路径;
  3. 请勿覆盖Python类型(例如list);
  4. 关闭文本文件或使用with open('DeleteFiles.txt') as flist

编辑:实际上,在查看您的代码时,由于os.chdir(path),可能不需要第二点。


import os
path = "c:\\Users\\SFMe\\Desktop\\DeleteFolder"
os.chdir(path)
flist = open('DeleteFiles.txt')
for f in flist:
    fname = f.rstrip() # or depending on situation: f.rstrip('\n')
    # or, if you get rid of os.chdir(path) above,
    # fname = os.path.join(path, f.rstrip())
    if os.path.isfile(fname): # this makes the code more robust
        os.remove(fname)

# also, don't forget to close the text file:
flist.close()

答案 1 :(得分:1)

正如Henry Yik在评论中指出的那样,在使用os.remove函数时,您需要传递完整的路径。同样,open函数仅返回file对象。您需要从文件中读取行。并且不要忘记关闭文件。一个解决方案是:

import os
path = "c:\\Users\\SFMe\\Desktop\\DeleteFolder"
os.chdir(path)
list_file = open('DeleteFiles.txt', "r") # added the argument to indicates only reading
list = list_file.read().splitlines()
list_file.close()
for f in list:
   os.remove(os.path.join(path,f))

进一步的改进是使用列表理解而不是循环和with块,该块“自动”为我们关闭了文件:

with open('DeleteFiles.txt', "r") as list_file:
    list = list_file.read().splitlines()
    [os.remove(os.path.join(path,f)) for f in list]