Python 如何获取文件夹中的最新文件?

Python 如何获取文件夹中的最新文件?,python,python-3.x,python-2.7,Python,Python 3.x,Python 2.7,我需要使用python获取文件夹的最新文件。在使用代码时: max(files, key = os.path.getctime) 我得到以下错误: FileNotFoundError:[WinError 2]系统找不到指定的文件:“a”尝试按创建时间对项目进行排序。下面的示例对文件夹中的文件进行排序,并获取最新的第一个元素 import glob import os files_path = os.path.join(folder, '*') files = sorted( glob

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

max(files, key = os.path.getctime)
我得到以下错误:


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

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

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]

分配给
文件
变量的内容不正确。使用以下代码

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)
(编辑以改进答案)

首先定义一个函数get_latest_file

def get_latest_file(path, *paths):
    fullpath = os.path.join(path, paths)
    ...
get_latest_file('example', 'files','randomtext011.*.txt')
您也可以使用docstring

def get_latest_file(path, *paths):
    """Returns the name of the latest (most recent) file 
    of the joined path(s)"""
    fullpath = os.path.join(path, *paths)
如果使用Python 3,则可以使用

完成返回最新文件名的代码:

def get_latest_file(path, *paths):
    """Returns the name of the latest (most recent) file 
    of the joined path(s)"""
    fullpath = os.path.join(path, *paths)
    files = glob.glob(fullpath)  # You may use iglob in Python3
    if not files:                # I prefer using the negation
        return None                      # because it behaves like a shortcut
    latest_file = max(files, key=os.path.getctime)
    _, filename = os.path.split(latest_file)
    return filename
这是一个相当不完整的代码。什么是
文件
?它可能是一个文件名列表,来自
os.listdir()

但是这个列表只列出文件名部分(也称为“基本名称”),因为它们的路径是公共的。为了正确地使用它,您必须将它与通向它的路径(用于获取它)结合起来

例如(未经测试):


我试图使用上述建议,但我的程序崩溃了,我发现我试图识别的文件被使用了,当我试图使用“os.path.getctime”时,它崩溃了。 最终对我起作用的是:

    files_before = glob.glob(os.path.join(my_path,'*'))
    **code where new file is created**
    new_file = set(files_before).symmetric_difference(set(glob.glob(os.path.join(my_path,'*'))))
这段代码获取两组文件列表之间的不常见对象
它不是最优雅的,如果同时创建多个文件,它可能不会稳定

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

iglob()返回一个迭代器,该迭代器生成与glob()相同的值,而实际上不同时存储所有值

这意味着
glob.iglob()
将更加高效

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

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


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

它需要iterable,所以第一个参数应该是iterable。
在查找num的最大值时,我们可以使用以下变量:
max(num1,num2,num3,*args[,key])
在windows(0.05秒)上使用更快的方法,调用一个执行此操作的bat脚本:

获取最新消息

@echo off
for /f %%i in ('dir \\directory\in\question /b/a-d/od/t:c') do set LAST=%%i
%LAST%
其中
\\directory\in\question
是您要调查的目录

获取最新的.py

from subprocess import Popen, PIPE
p = Popen("get_latest.bat", shell=True, stdout=PIPE,)
stdout, stderr = p.communicate()
print(stdout, stderr)
如果它找到一个文件,
stdout
是路径,
stderr
是无


使用
stdout.decode(“utf-8”).rstrip()
获取文件名的可用字符串表示形式。

我缺乏评论的声誉,但来自Marlon Abeykoons的响应的ctime没有为我提供正确的结果。不过,使用mtime就可以做到这一点。(key=os.path.getmtime)

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


我在Python3中使用过这个,包括文件名上的模式匹配

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)


您要查找哪个文件?将你的相关代码添加到问题中。我猜为什么它对你不起作用:“文件”是文件名元素的列表还是单个文件名字符串?你从哪里获得JUniterAccessLog-standalone-FCL_VPN部分的?在Windows 10下,这在0长度的文件上失败。我相信投票人可以解释到底是怎么回事。不知道,为你测试,它似乎确实有效。除此之外,你是唯一一个愿意解释一下的人。阅读被接受的答案让我觉得“glob”的东西是必要的,但它绝对不是。Thanks@David当然只要将
if basename.endswith('.csv')
插入到列表中即可。@BreakBadSP如果您想要灵活性,您是对的。如果你被限制在某个目录下,我看不出你的目录有多高效。但是有时候,可读性比效率更重要,所以从这个意义上说,你的可能确实更好。谢谢你,我已经在我的很多ETL函数中使用了它!如果我想查找最新创建/修改的文件夹而不是文件,该怎么办?@Link相同的代码适用于此。如果你想检查它是否是一个文件夹,你可以检查
如果os.path.isdir(最新的\u文件):
wird。我不得不用“min”来获取最新的文件。一些搜索暗示这是特定于操作系统的。这是一个很好的答案——谢谢!我更喜欢使用
pathlib.Path
对象,而不是字符串和os.Path。对于pathlib.Path对象,您的答案是:
list_of_Path=folder_Path.glob('*');最新的路径=max(路径列表,key=lambda p:p.stat().st\u ctime)
@phil你仍然可以使用
os.path.getctime
作为键,即使使用
path
对象。不确定为什么这会吸引选票,对于那些需要快速完成这项任务的人来说,这是我能找到的最快的方法。有时很有必要很快做到这一点。投票表决。我不是在Windows中这样做的,但是如果你想提高速度,其他答案需要对目录中的所有文件进行迭代。因此,如果您的操作系统中可以使用指定所列文件排序顺序的shell命令,那么提取第一个或最后一个结果的速度应该会更快。谢谢,我实际上更关心的是一个比这个更好的解决方案(就像在同样快但纯python中一样),所以希望有人能够详细说明。抱歉,但我不得不投反对票,我会礼貌地向你解释原因。最大的原因是它没有使用python(不是跨平台的),因此除非在Windows下运行,否则会被破坏。其次,这不是一种“更快的方法”(除非“更快”意味着快速和肮脏,而不必费心阅读文档)--向另一个脚本输出是出了名的慢。@MarkHu实际上,这个脚本是为了从python脚本中快速检查一个大文件夹的内容而产生的。所以在这种情况下,更快的方法意味着
from subprocess import Popen, PIPE
p = Popen("get_latest.bat", shell=True, stdout=PIPE,)
stdout, stderr = p.communicate()
print(stdout, stderr)
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)
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)