파이썬을 사용하여 폴더의 최신 파일을 가져와야합니다. 코드를 사용하는 동안 :
max(files, key = os.path.getctime)
아래 오류가 발생합니다.
FileNotFoundError: [WinError 2] The system cannot find the file specified: 'a'
파이썬을 사용하여 폴더의 최신 파일을 가져와야합니다. 코드를 사용하는 동안 :
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
if os.path.isdir(latest_file):
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)
os.path.getctime
하더라도 여전히 키로 사용할 수 있습니다 Path
.
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)
if basename.endswith('.csv')
목록 이해력에 삽입 하십시오.
더 효율적이므로 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])
max()
종류를 좋아한다 . 제 경우 key=os.path.basename
에는 파일 이름에 타임 스탬프가 있기 때문에 다른 이름을 사용했습니다.
나는 논평 할 명성이 부족하지만 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
(답변 개선을 위해 수정 됨)
먼저 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
부품은 어디서 얻었 습니까?
나는 위의 제안을 사용하려고 시도했고 내 프로그램이 추락했습니다. 확인하려는 파일이 사용되었고 '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()
파일 이름의 사용 가능한 문자열 표현을 얻을 수 있습니다.
ls -Art | tail -n 1
. 솔루션에 대한 주장을하기 전에 솔루션의 성능을 평가하십시오.