Python OS.REMOVE不太正常

Python OS.REMOVE不太正常,python,python-3.x,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

我正在创建一个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\u dir
变量,如果我将其设置回一个目录,那么它看起来像这样的
files\u 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 
/usr/bin/python3.5/root/PycharmProjects/ReportApp/FML/dump.py
回溯(最近一次呼叫最后一次):
文件“/root/PycharmProjects/ReportApp/FML/dump.py”,第16行,在
pdf_清理(“mer”)
文件“/root/PycharmProjects/ReportApp/FML/dump.py”,第13行,pdf格式
删除操作系统(f)
FileNotFoundError:[Errno 2]没有这样的文件或目录:“Main\u Calls.pdf”
进程已完成,退出代码为1
有什么愚蠢的小东西我忽略了吗??我不明白为什么更改一个文件夹会破坏它

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\u dir

解决方案简单明了:连接
files\u dir
f
以获得完整路径:

 os.remove(os.path.join(files_dir, f))
作为旁注:在列表理解中有一个测试,在for循环中有另一个测试。您也可以将这两个选项都放在comp列表中:

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))
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\u dir

解决方案简单明了:连接
files\u dir
f
以获得完整路径:

 os.remove(os.path.join(files_dir, f))
作为旁注:在列表理解中有一个测试,在for循环中有另一个测试。您也可以将这两个选项都放在comp列表中:

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

xx
是文件名列表,而不是文件路径。将路径与目录合并如下:
os.remove(os.path.join(files_dir,f))
xx
是文件名列表,而不是文件路径。将路径与目录合并,如下所示:
os.remove(os.path.join(files_dir,f))

看起来您没有使用新位置请尝试
os.remove(files_dir+'/'+f)
os.listdir(files_dir)
返回文件名+扩展名的列表。因此,如果文件与可执行文件位于同一目录中,它就可以工作。因此,您应该调用
os.remove(os.path.join(files_dir,f))
来连接路径和文件名。看起来您没有使用新位置。请尝试
os.remove(files_dir+'/'+f)
os.listdir(files_dir)
返回文件名和扩展名的列表。因此,如果文件与可执行文件位于同一目录中,它就可以工作。因此,您应该调用
os.remove(os.path.join(files\u dir,f))
来连接路径和文件名。