我已经搜索了许多有关根据某些参数删除多个文件(例如所有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'
我觉得我缺少一些简单的东西。任何帮助将不胜感激!
谢谢
答案 0 :(得分:4)
'\n'
结尾的条带; path
与文件名连接起来来获得绝对路径; list
); 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]