Python - OSError:[Errno 2]没有这样的文件或目录

问题描述:

我已经阅读了很多与这个问题有关的问题,但我注意到它发生了很多很多原因,并没有找到答案给我特别的问题。事情是,我不小心删除了一些文件,并使用photorec来尝试恢复它们(我在Ubuntu 16.04 Xenial上)。问题是,它恢复了2600多个文件夹!我正在写一个小文件抓取工具来摆脱我不需要的文件 - 唯一感兴趣的文件是.py,.jpg,.png和.mp3。下面是代码到我的履带:Python - OSError:[Errno 2]没有这样的文件或目录

import os 

path= 

for (path, dirs, files) in os.walk(path): 
    for name in files: 
     if name.endswith('.py') or name.endswith('.jpg') or name.endswith('.png') or name.endswith('.mp3'): 
      continue 
     else: os.remove(name) 

我定义了“路径”手动,和我做了一个测试,我打印的路径,显示目录和文件的一部分,它打印我想要的东西。但是,在运行下面的代码时,它将返回:

OSError: [Errno 2] No such file or directory: 'f0272560.java' 

我假设这是我尝试删除的第一个文件。我猜测它已经被删除后再次查找该文件。这是否有意义,或者它是否会引发错误?我怎么能解决这个问题?

提前致谢!

+1

你只传递文件名到'os.remove()'。你应该传递完整的路径名。 –

fileslistyield ed os.walk是文件的非限定名称。除非它们恰好位于工作目录中,否则os.remove无法通过非限定名称删除它们,因为它不知道在哪里找到它们。变化:

os.remove(name) 

os.remove(os.path.join(path, name)) 

所以你传递一个合格的文件路径,而不只是它的名字。

附注:虽然如果您从不需要path的原始定义,那么使用每个回路pathos.walk覆盖它可能会引起混淆。您可能想更改其中一个名称,或者将*名称更改为rootdir或将循环变量名称更改为其他名称(例如curdir)。

+0

非常感谢!我不清楚如何正确使用os.walk – DarthDante

+0

@DarthDante:Yar,'os.listdir'由于相同的原因而令人困惑。对于'os.listdir',我建议用'os.scandir'替代它(3.5或更高版本只有悲伤; 3.5以前,你需要PyPI包'scandir'使用等效的'scandir.scandir'),其中条目返回对于裸号名称具有'.name'属性,对于有限路径具有'.path';对'os.walk'来说,在'walk'循环中前两行是'qdirs = [os.path.join(path,d)for d in dirs]''''qfiles = [ os.path.join(path,f)for f in files]'所以你可以迭代'qdirs' /'qfiles'来获得预定义的路径。 – ShadowRanger