Tôi cần lấy tệp mới nhất của một thư mục bằng python. Trong khi sử dụng mã:
max(files, key = os.path.getctime)
Tôi gặp lỗi dưới đây:
FileNotFoundError: [WinError 2] The system cannot find the file specified: 'a'
Tôi cần lấy tệp mới nhất của một thư mục bằng python. Trong khi sử dụng mã:
max(files, key = os.path.getctime)
Tôi gặp lỗi dưới đây:
FileNotFoundError: [WinError 2] The system cannot find the file specified: 'a'
Câu trả lời:
Bất cứ điều gì được gán cho files
biến là không chính xác. Sử dụng mã sau.
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
các đối tượng hơn là chuỗi và os.path. Với các đối tượng pathlib.Path, câu trả lời của bạn sẽ trở thành: list_of_paths = folder_path.glob('*'); latest_path = max(list_of_paths, key=lambda p: p.stat().st_ctime)
os.path.getctime
làm khóa, ngay cả với Path
các đối tượng.
max(files, key = os.path.getctime)
là mã khá không đầy đủ. Là files
gì? Nó có thể là một danh sách các tên tệp, sắp ra os.listdir()
.
Nhưng danh sách này chỉ liệt kê các phần tên tệp (còn gọi là "tên cơ sở"), vì đường dẫn của chúng là chung. Để sử dụng nó một cách chính xác, bạn phải kết hợp nó với đường dẫn đến nó (và được sử dụng để lấy nó).
Chẳng hạn như (chưa được kiểm tra):
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')
vào danh sách dễ hiểu.
Tôi sẽ đề nghị sử dụng glob.iglob()
thay vì sử dụng glob.glob()
, vì nó hiệu quả hơn.
global.iglob () Trả về một trình vòng lặp mang lại các giá trị giống như global () mà không thực sự lưu trữ tất cả chúng đồng thời.
Phương tiện nào glob.iglob()
sẽ hiệu quả hơn.
Tôi chủ yếu sử dụng mã dưới đây để tìm tệp mới nhất phù hợp với mẫu của tôi:
LatestFile = max(glob.iglob(fileNamePattern),key=os.path.getctime)
LƯU Ý: Có các biến thể của max
hàm, Trong trường hợp tìm thấy tệp mới nhất, chúng tôi sẽ sử dụng biến thể dưới đây:
max(iterable, *[, key, default])
cần có thể lặp để tham số đầu tiên của bạn phải có thể lặp lại. Trong trường hợp tìm tối đa nums, chúng ta có thể sử dụng biến thể beow:max (num1, num2, num3, *args[, key])
max()
. Trong trường hợp của tôi, tôi đã sử dụng một tên khác key=os.path.basename
vì tên tệp có dấu thời gian trong đó.
Cố gắng sắp xếp các mục theo thời gian tạo. Ví dụ dưới đây sắp xếp các tệp trong một thư mục và nhận phần tử đầu tiên là phần tử mới nhất.
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]
Tôi không có danh tiếng để bình luận nhưng ctime từ phản hồi của Marlon Abeykoons không đưa ra kết quả chính xác cho tôi. Sử dụng mtime thực hiện thủ thuật. (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
Tôi đã tìm thấy hai câu trả lời cho vấn đề đó:
python os.path.getctime max không trả về mới nhất Sự khác biệt giữa python - getmtime () và getctime () trong hệ thống unix
(Đã chỉnh sửa để cải thiện câu trả lời)
Đầu tiên hãy xác định một hàm get_latest_file
def get_latest_file(path, *paths):
fullpath = os.path.join(path, paths)
...
get_latest_file('example', 'files','randomtext011.*.txt')
Bạn cũng có thể sử dụng một chuỗi tài liệu!
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)
Nếu bạn sử dụng Python 3 , bạn có thể sử dụng iglob để thay thế.
Hoàn thành mã để trả về tên của tệp mới nhất:
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
một phần từ đâu?
Tôi đã cố gắng sử dụng các đề xuất trên và chương trình của tôi bị lỗi, tôi đã tìm ra tệp mà tôi đang cố xác định đã được sử dụng và khi cố gắng sử dụng 'os.path.getctime', nó đã bị lỗi. những gì cuối cùng đã làm việc cho tôi là:
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,'*'))))
mã này nhận được đối tượng không phổ biến giữa hai tập hợp danh sách tệp không phải là đối tượng tốt nhất và nếu nhiều tệp được tạo cùng một lúc, nó có thể sẽ không ổn định
Một phương pháp nhanh hơn nhiều trên windows (0,05 giây), gọi một tập lệnh bat thực hiện điều này:
get_latest.bat
@echo off
for /f %%i in ('dir \\directory\in\question /b/a-d/od/t:c') do set LAST=%%i
%LAST%
đâu \\directory\in\question
là thư mục bạn muốn điều tra.
get_latest.py
from subprocess import Popen, PIPE
p = Popen("get_latest.bat", shell=True, stdout=PIPE,)
stdout, stderr = p.communicate()
print(stdout, stderr)
nếu nó tìm thấy một tệp stdout
là đường dẫn và stderr
là Không.
Sử dụng stdout.decode("utf-8").rstrip()
để lấy biểu diễn chuỗi có thể sử dụng của tên tệp.
ls -Art | tail -n 1
. Vui lòng đánh giá hiệu suất của giải pháp trước khi đưa ra tuyên bố về giải pháp đó.
Tôi đã sử dụng điều này trong Python 3, bao gồm cả đối sánh mẫu trên tên tệp.
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)