2015-09-06 177 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更快。