IT

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

lottoking 2020. 9. 4. 07:42
반응형

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


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

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

아래 오류가 발생합니다.

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


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

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)

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

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]

효율적이므로 더 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])


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

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

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

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


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()파일 이름의 사용 가능한 문자열 표현을 얻을 수 있습니다.

참고 URL : https://stackoverflow.com/questions/39327032/how-to-get-the-latest-file-in-a-folder-using-python

반응형