Python OS.REMOVE不太正常
我正在创建一个PDF生成程序。其中一个功能是合并所有PDF,然后删除所有片段。在我改变pdfs的路径之前,它一直工作得很好。以下是函数: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
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))
来连接路径和文件名。