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

2025-02-28 08:23:00
admin
原创
62
摘要:问题描述:我需要使用python获取文件夹的最新文件。使用代码时:max(files, key = os.path.getctime) 我收到以下错误: FileNotFoundError: [WinError 2] The system cannot find the file specified: 'a'...

问题描述:

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

max(files, key = os.path.getctime)

我收到以下错误:

FileNotFoundError: [WinError 2] The system cannot find the file specified: 'a'


解决方案 1:

分配给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)

解决方案 2:

max(files, key = os.path.getctime)

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

但此列表仅列出文件名部分(又称“基本名称”),因为它们的路径是通用的。为了正确使用它,您必须将其与指向它的路径(以及用于获取它的路径)结合起来。

如(未经测试):

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

解决方案 3:

我缺乏评论的声誉,但 Marlon Abeykoons 的 ctime 回复并没有给我正确的结果。不过使用 mtime 就可以了。(key=os.path.get m time))

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)

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

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

解决方案 4:

我一直在 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)

解决方案 5:

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

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

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

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

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


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

它需要可迭代,因此您的第一个参数应该是可迭代的。如果要查找 nums 的最大值,我们可以使用以下变体:max (num1, num2, num3, *args[, key])

解决方案 6:

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

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]

解决方案 7:

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

我发现下面的示例更有用且更相关,因为我们可以使用相同的代码来获取最新的 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

解决方案 8:

在 Windows 上,有一种更快的方法(0.05 秒),调用执行此操作的 bat 脚本:

获取最新信息

@echo off
for /f %%i in ('dir \\directoryinquestion /b/a-d/od/t:c') do set LAST=%%i
%LAST%

\directoryinquestion您要调查的目录在哪里。

获取最新信息

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()获取文件名的可用字符串表示形式。

解决方案 9:

(编辑以改进答案)

首先定义一个函数get_latest_file

def get_latest_file(path, *paths):
    fullpath = os.path.join(path, paths)
    ...
get_latest_file('example', 'files','randomtext011.*.txt')

您也可以使用文档字符串!

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,则可以改用iglob。

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

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

解决方案 10:

我尝试使用上述建议,但我的程序崩溃了,然后我发现我试图识别的文件已被使用,当尝试使用“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,'*'))))

此代码获取两组文件列表之间的不常见对象,它不是最优雅的,如果同时创建多个文件,它可能会不稳定

解决方案 11:

在 Linux 上,您还可以shellpython

subprocess.run需要python 3.5+

import subprocess

def find_latest_files(target_dir, count):
    cmd = f"ls -t {target_dir} | head -n{count}"

    try:
        output = subprocess.run(cmd, shell=True, text=True, capture_output=True, check=False)
    except subprocess.CalledProcessError as err:
        sys.exit(f"Error: finding last modified file {err.output[1]}")

    # returns a list[]
    return output.stdout.splitlines()
相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   3592  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   2442  
  敏捷每日站会作为敏捷项目管理中的关键环节,对于提升产品生命周期管理(PLM)效率有着不可忽视的作用。PLM涵盖了产品从概念产生到最终报废的全过程管理,涉及众多环节与人员,而每日站会能够通过优化沟通机制,让信息在团队中快速、准确地流动,从而推动整个PLM流程更加顺畅、高效。接下来,我们将深入探讨如何通过四步优化沟通机制,...
plm系统   17  
  在企业的发展进程中,产品生命周期管理(PLM)项目管理至关重要,而数据驱动决策则是提升PLM项目管理效能的关键手段。通过运用合适的分析模型,企业能够从海量数据中挖掘有价值的信息,为决策提供有力支撑,进而优化产品全生命周期的各个环节。以下将详细介绍助力PLM项目管理实现数据驱动决策的5大分析模型。需求分析模型需求分析是P...
plm系统功能介绍   19  
  PLM(产品生命周期管理)系统在企业的产品研发、生产与运营中扮演着至关重要的角色。它涵盖了从产品概念设计到退役的全流程管理,确保产品数据的有效整合与协同。然而,在复杂多变的商业环境中,黑天鹅事件随时可能降临,给企业带来难以预估的冲击。这些意外事件具有不可预测性、极大的影响力和事后的可解释性等特点,会对PLM系统的正常运...
plm系统的主要功能模块   16  
热门文章
项目管理软件有哪些?
曾咪二维码

扫码咨询,免费领取项目管理大礼包!

云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用