OS.REMOVE不太正常

时间:2017-06-12 15:17:19

标签: python python-3.x

我正在创建一个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 

我有什么愚蠢和小的东西吗?我不明白为什么更换一个文件夹会破坏它。

2 个答案:

答案 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_dirf以获取完整路径:

 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))