我正在创建一个PDF生成程序。一个功能是合并所有pdf并删除之后的所有部分。我完美地工作,直到我改变了pdfs的路径。这是功能:
def pdf_cleanup(name):
files_dir = '/root/PycharmProjects/ReportApp/FML/Pdf_Docs'
xx = [f for f in os.listdir(files_dir) if f.endswith("pdf")]
for f in xx:
if f.startswith(name):
pass
else:
os.remove(f)
return
查看files_dir
变量,如果我将其设置回一个目录 - 所以它看起来像这样files_dir = '/root/PycharmProjects/ReportApp/FML'
比它工作正常。当我尝试在Pdf_Docs目录中使用它时,我错误地说'name_of_pdf'不存在,当它出现时。
回溯:
/usr/bin/python3.5 /root/PycharmProjects/ReportApp/FML/dump.py
Traceback (most recent call last):
File "/root/PycharmProjects/ReportApp/FML/dump.py", line 16, in <module>
pdf_cleanup('mer')
File "/root/PycharmProjects/ReportApp/FML/dump.py", line 13, in pdf_cleanup
os.remove(f)
FileNotFoundError: [Errno 2] No such file or directory: 'Main_Calls.pdf'
Process finished with exit code 1
我有什么愚蠢和小的东西吗?我不明白为什么更换一个文件夹会破坏它。
答案 0 :(得分:3)
os.listdir()
只会提供文件名,而不是它们的路径,即:
>>> files_dir = "/home/bruno/Work/blookup/src/project/blookcore"
>>> [f for f in os.listdir(files_dir) if f.endswith(".py")]
['tasks.py', 'posts.py', 'models.py', '__init__.py', 'signals.py', 'urls.py', 'utils.py', 'translation.py', 'views.py', 'forms.py', 'fields.py', 'storages.py', 'admin.py', 'managers.py']
因此,当您在其中一个文件名上调用os.remove()
时,它会在当前工作目录中查找此文件,而不是files_dir
。
解决方案简单明了:加入files_dir
和f
以获取完整路径:
os.remove(os.path.join(files_dir, f))
作为旁注:你在列表理解中有一个测试,在for循环中有另一个测试。你也可以把它们放在列表中:
xx = [
f for f in os.listdir(files_dir)
if f.endswith("pdf") and not f.startswith(name)
]
for f in xx:
os.remove(os.path.join(files_dir, f))
答案 1 :(得分:0)
xx
是文件名列表,而不是文件路径。将路径与目录合并为:os.remove(os.path.join(files_dir, f))