2016-09-22 205 views
0

我已經閱讀了很多與這個問題有關的問題,但我注意到它發生了很多很多原因,並沒有找到答案給我特別的問題。事情是,我不小心刪除了一些文件,並使用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()'。你應該傳遞完整的路徑名。 –

回答

1

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

相關問題