2015-09-06 176 views
0

我試圖檢索在目錄中添加或修改的最新文件。我在論壇上的一個獲得該代碼使用下面的方法:如何檢索python文件夾中的最新文件

import os 

filelist = os.listdir('MYDIRECTORY') 
filelist = filter(lambda x: not os.path.isdir(x), filelist) 
newest = max(filelist, key=lambda x: os.stat(x).st_mtime) 

我把我的目錄那裏,它給了我下面的錯誤:

Traceback (most recent call last): 
    File "test.py", line 8, in <module> 
    newest = max(filelist, key=lambda x: os.stat(x).st_mtime) 
    File "test.py", line 8, in <lambda> 
    newest = max(filelist, key=lambda x: os.stat(x).st_mtime) 
OSError: [Errno 2] No such file or directory: 'NAME OF FILE' 

與上面顯示的最新文件的名稱。所以它找到了這個文件,但是可能是什麼問題。請幫助

+1

請編輯你的問題,並且包括你正在運行的代碼的全文**。您使用'「。」'作爲'MYDIRECTORY'時,您給出的代碼適合我。 – MattDMo

回答

2
  1. 相反的not os.path.isdir(x)你應該使用os.path.isfile(x)

  2. filter已棄用;列表內涵是首選:

    filelist = [f for f in filelist if os.path.isfile(f)] 
    
  3. os.listdir只是給你的目錄中的項目,而不是完整路徑的名稱。要獲得完整路徑,您需要執行諸如os.path.join('MYDIRECTORY', f)之類的操作。

因此,所有的搞掂它應該看起來像:

import os 

rootpath = 'MYDIRECTORY' 
filelist = [os.path.join(rootpath, f) for f in os.listdir(rootpath)] 
filelist = [f for f in filelist if os.path.isfile(f)] 
newest = max(filelist, key=lambda x: os.stat(x).st_mtime) 
0

os.listdir()不包括您在返回的路徑中列出的目錄。因此,在撥打os.stat(x)之前,您必須先將os.chdir("MYDIRECTORY")加入其中,或者預先填入os.stat("MYDIRECTORY/" + x)之類的目錄名稱。

chdir事先在當前目錄中使用listdir,如os.listdir(".")

0

的問題是,os.listdir returns file names, not paths。雖然看起來下一個命令(在os.path.isdir上進行過濾)僅適用於名稱,但您應該注意到isdir返回False,此時沒有該名稱的對象存在。

你需要做的是與文件名結合的路徑:

import os 

dirname = 'MYDIRECTORY' 
filenames = os.listdir(dirname) 
filepaths = [os.path.join(dirname, filename) for filename in filenames] 
files = [f for f in filepaths if not os.path.isdir(f)] 
newest = max(files, key=lambda x: os.stat(x).st_mtime) 

注意,我更換了過濾器的呼叫與列表理解。這被認爲是更多'Pythonic'(eww),但我這樣做是因爲列表解析通常比Python中的filter/map更快。