如何使用python获取文件夹中的最新文件

gar*_*pak 97 python python-2.7 python-3.x

我需要使用python获取文件夹的最新文件.使用代码时:

max(files, key = os.path.getctime)
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

FileNotFoundError:[WinError 2]系统找不到指定的文件:'a'

Mar*_*oon 259

分配给files变量的任何内容都是错误的.使用以下代码.

import glob
import os

list_of_files = glob.glob('/path/to/folder/*') # * means all if need specific format then *.csv
latest_file = max(list_of_files, key=os.path.getctime)
print latest_file
Run Code Online (Sandbox Code Playgroud)

  • 这是一个很好的答案 - 谢谢!我喜欢使用`pathlib.Path`对象而不是字符串和os.path.使用pathlib.Path对象,您的答案将变为:``list_of_paths = folder_path.glob('*'); latest_path = max(list_of_paths,key = lambda p:p.stat().st_ctime)`` (8认同)
  • @phil 您仍然可以使用 `os.path.getctime` 作为键,即使使用 `Path` 对象。 (4认同)
  • 如果要查找最新创建/修改的文件夹而不是文件怎么办? (3认同)
  • @Link 相同的代码适用于此。如果你想检查它的文件夹,你可以检查`if os.path.isdir(latest_file): ` (3认同)
  • 奇怪的.我不得不使用"min"来获取最新文件.一些搜索暗示它是特定的. (3认同)

glg*_*lgl 30

max(files, key = os.path.getctime)
Run Code Online (Sandbox Code Playgroud)

是完全不完整的代码.什么是files?它可能是一个文件名列表,来自os.listdir().

但是这个列表只列出了文件名部分(又名"basenames"),因为它们的路径很常见.为了正确使用它,你必须将它与通向它的路径相结合(并用于获取它).

如(未经测试):

def newest(path):
    files = os.listdir(path)
    paths = [os.path.join(path, basename) for basename in files]
    return max(paths, key=os.path.getctime)
Run Code Online (Sandbox Code Playgroud)

  • 不知道,为您测试过,它似乎确实有效。最重要的是,你是唯一一个愿意解释一下的人。阅读接受的答案让我认为需要“glob”的东西,而绝对不是。谢谢 (5认同)
  • 我相信反对者可以解释到底出了什么问题。 (3认同)
  • @David当然。只需将`if basename.endswith('。csv')`插入列表推导中。 (2认同)
  • 感谢这一点,我已经在我的许多 ETL 函数中使用了它! (2认同)

Jam*_*ull 18

我一直在 Python 3 中使用它,包括文件名的模式匹配。

from pathlib import Path

def latest_file(path: Path, pattern: str = "*"):
    files = path.glob(pattern)
    return max(files, key=lambda x: x.stat().st_ctime)
Run Code Online (Sandbox Code Playgroud)

  • 如果添加 max arg 默认值以支持不匹配路径/模式的文件,效果会更好 - 在这种情况下 max(和 min)会引发 ValueError,因此最好设置默认值 - 需要 python 3.4+ (3认同)

小智 14

我缺乏发表评论的声誉,但 Marlon Abeykoons 的回应并没有给我正确的结果。不过,使用 mtime 可以解决问题。(key=os.path.get m时间))

import glob
import os

list_of_files = glob.glob('/path/to/folder/*') # * means all if need specific format then *.csv
latest_file = max(list_of_files, key=os.path.getmtime)
print(latest_file)
Run Code Online (Sandbox Code Playgroud)

我找到了这个问题的两个答案:

python os.path.getctime max 不返回最新 python - getmtime() 和 getctime() 在 unix 系统中的区别


Bre*_*dSP 12

我建议使用glob.iglob()而不是glob.glob(),因为它更有效。

glob.iglob() 返回一个迭代器,它产生与 glob() 相同的值,而不实际同时存储它们。

这意味着glob.iglob()效率会更高。

我主要使用以下代码来查找与我的模式匹配的最新文件:

LatestFile = max(glob.iglob(fileNamePattern),key=os.path.getctime)


注意:有max函数的变体,如果找到最新的文件,我们将使用以下变体: max(iterable, *[, key, default])

需要迭代,所以你的第一个参数应该是可迭代的。在找到最大数量的情况下,我们可以使用以下变体:max (num1, num2, num3, *args[, key])

  • 我喜欢这种“max()”排序。就我而言,我使用了不同的“key=os.path.basename”,因为文件名中包含时间戳。 (2认同)

tur*_*kus 5

尝试按创建时间对项目进行排序。下面的示例对文件夹中的文件进行排序并获取最新的第一个元素。

import glob
import os

files_path = os.path.join(folder, '*')
files = sorted(
    glob.iglob(files_path), key=os.path.getctime, reverse=True) 
print files[0]
Run Code Online (Sandbox Code Playgroud)


Sac*_*hin 5

大多数答案都是正确的,但如果有像获取最新的两个或三个最新的要求,那么它可能会失败或需要修改代码。

我发现下面的示例更有用且相关,因为我们也可以使用相同的代码来获取最新的 2,3 和 n 文件。

import glob
import os

folder_path = "/Users/sachin/Desktop/Files/"
files_path = os.path.join(folder_path, '*')
files = sorted(glob.iglob(files_path), key=os.path.getctime, reverse=True) 
print (files[0]) #latest file 
print (files[0],files[1]) #latest two files
Run Code Online (Sandbox Code Playgroud)