Python을 사용하여 폴더에서 최신 파일을 가져 오는 방법


126

파이썬을 사용하여 폴더의 최신 파일을 가져와야합니다. 코드를 사용하는 동안 :

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

아래 오류가 발생합니다.

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


2
어떤 파일을 찾으려고합니까? 질문에 관련 코드를 추가하십시오.
Naeem Ul Wahhab 2016 년

1
왜 그것이 당신을 위해 작동하지 않을지 추측하고 있습니다. "파일"이 파일 이름 요소 목록입니까 아니면 단일 파일 이름 문자열입니까?
mpurg

답변:


322

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

4
파일 대신 최근 생성 / 수정 된 폴더를 찾으려면 어떻게합니까?
링크

1
@Link 동일한 코드가 작동합니다. 당신이 자사의 폴더를 확인하려는 여부를 경우 유 확인할 수 있습니다if os.path.isdir(latest_file):
말론 Abeykoon에게

6
기묘한. 최신 파일을 얻으려면 "min"을 사용해야했습니다. 주변을 검색하는 사람들은 OS에 특화되어 있음을 암시했습니다.
Graeck

15
이것은 훌륭한 답변입니다. 감사합니다! 나는 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)
Phil

4
@phil 객체를 사용 os.path.getctime하더라도 여전히 키로 사용할 수 있습니다 Path.
Berislav Lopac 2018

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

매우 불완전한 코드입니다. 무엇입니까 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)

나는 반대 투표자들이 정확히 무엇이 잘못되었는지 설명 할 수 있다고 확신합니다.
glglgl

3
Dunno, 테스트를 마쳤습니다. 작동하는 것 같습니다. 게다가, 당신은 약간의 설명에 관심을 가진 유일한 사람이었습니다. 받아 들여진 대답을 읽으면 'glob'이 필요하다고 생각했지만 절대 그렇지 않습니다. 감사합니다
Arnaud P

4
@David 물론입니다. if basename.endswith('.csv')목록 이해력에 삽입 하십시오.
glglgl

1
@BreakBadSP 유연성을 원한다면 맞습니다. 특정 디렉토리로 제한되어 있다면 어떻게 더 효율적일 수 있는지 알 수 없습니다. 그러나 때로는 가독성이 효율성보다 더 중요하므로 그 점에서 당신의 것이 더 나을 수도 있습니다.
glglgl

1
감사합니다. 저는 많은 ETL 기능에서 이것을 사용했습니다!
Manakin

9

더 효율적이므로 glob.iglob()대신을 사용 하는 것이 좋습니다 glob.glob().

glob.iglob () 실제로 모든 값을 동시에 저장하지 않고 glob ()과 동일한 값을 산출하는 반복자를 반환합니다.

즉, glob.iglob()더 효율적입니다.

나는 주로 아래 코드를 사용하여 내 패턴과 일치하는 최신 파일을 찾습니다.

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


참고 : max기능의 변형이 있습니다. 최신 파일을 찾는 경우 아래 변형을 사용합니다. max(iterable, *[, key, default])

이터 러블이 필요하므로 첫 번째 매개 변수는 이터 러블이어야합니다. 최대 nums를 찾는 경우 beow variant를 사용할 수 있습니다.max (num1, num2, num3, *args[, key])


1
나는 이런 max()종류를 좋아한다 . 제 경우 key=os.path.basename에는 파일 이름에 타임 스탬프가 있기 때문에 다른 이름을 사용했습니다.
MarkHu

4

생성 시간별로 항목을 정렬하십시오. 아래 예제는 폴더의 파일을 정렬하고 가장 최근의 첫 번째 요소를 가져옵니다.

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]

4

나는 논평 할 명성이 부족하지만 Marlon Abeykoons의 응답에서 ctime은 나에게 올바른 결과를주지 못했습니다. 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

그 문제에 대한 두 가지 답을 찾았습니다.

python os.path.getctime max는 최신 차이점을 반환하지 않습니다 .python-getmtime () 및 getctime () in unix system


1

(답변 개선을 위해 수정 됨)

먼저 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

JuniperAccessLog-standalone-FCL_VPN부품은 어디서 얻었 습니까?
glglgl

Windows 10에서 길이가 0 인 파일에서는 실패합니다.
Superdooperhero

1

나는 위의 제안을 사용하려고 시도했고 내 프로그램이 추락했습니다. 확인하려는 파일이 사용되었고 '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,'*'))))

이 코드는 두 세트의 파일 목록 사이에서 흔하지 않은 객체를 가져옵니다. 가장 우아하지 않으며 동시에 여러 파일이 생성되면 아마도 안정적이지 않을 것입니다


1

Windows (0.05s)에서 훨씬 빠른 방법으로 다음과 같은 작업을 수행하는 bat 스크립트를 호출합니다.

get_latest.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조사 할 디렉토리는 어디에 있습니까 ?

get_latest.py

from subprocess import Popen, PIPE
p = Popen("get_latest.bat", shell=True, stdout=PIPE,)
stdout, stderr = p.communicate()
print(stdout, stderr)

파일을 찾으면 stdout경로 stderr가 None입니다.

사용하여 stdout.decode("utf-8").rstrip()파일 이름의 사용 가능한 문자열 표현을 얻을 수 있습니다.


이 작업을 빠르게 수행해야하는 사람들에게는 이것이 내가 찾을 수있는 가장 빠른 방법입니다. 그리고 때로는 이것을 매우 빠르게해야합니다.
ic_fl2

찬성하십시오. 나는 Windows에서 이것을하고 있지 않지만 속도를 찾고 있다면 다른 답변은 디렉토리의 모든 파일을 반복해야합니다. 나열된 파일의 정렬 순서를 지정하여 OS에서 쉘 명령을 당겨 사용할 수 있습니다 그렇다면 그 첫 번째 또는 마지막 결과는 해야 빠릅니다.
Jim Hunziker 2018

1
감사합니다. 저는 사실 이것보다 더 나은 솔루션에 더 관심이 있습니다 (비슷하게 빠르지 만 순수한 파이썬 에서처럼). 그래서 누군가가 그것에 대해 자세히 설명 할 수 있기를 바랐습니다.
ic_fl2

2
죄송합니다. 반대 투표를해야했습니다. 이유를 설명해 드리겠습니다. 가장 큰 이유는 Windows에서 실행하지 않는 한 (크로스 플랫폼이 아닌) 파이썬을 사용하지 않기 때문에 깨지기 때문입니다. 둘째, 이것은 "빠른 방법"이 아닙니다 (빠르다는 것이 문서를 읽을 때 빠르고 더러운 것을 의미하지 않는 한)-다른 스크립트로 셸링하는 것은 매우 느립니다.
MarkHu

1
@MarkHu 사실이 스크립트는 파이썬 스크립트에서 큰 폴더의 내용을 빠르게 확인하기 위해 만들어졌습니다. 따라서이 경우 더 빠른 방법은 최신 폴더의 파일 이름을 가장 빠르게 (또는 순수한 파이썬 방법보다 빠름) 가져옵니다. 을 기반으로하는 비슷한 Linux 용 스크립트를 자유롭게 추가 할 수 있습니다 ls -Art | tail -n 1. 솔루션에 대한 주장을하기 전에 솔루션의 성능을 평가하십시오.
ic_fl2

0

파일 이름에 대한 패턴 일치를 포함하여 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)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.