Мені потрібно отримати останній файл папки за допомогою 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'
Відповіді:
Що б не було присвоєно 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().
Але в цьому списку перелічені лише частини імен файлів (також "базові імена"), оскільки їх шлях є загальним. Щоб правильно ним користуватися, вам потрібно поєднувати його з шляхом, що веде до нього (і використовується для його отримання).
Такі як (неперевірений):
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])
який потребує ітерабельності, тому ваш перший параметр повинен бути ітерабельним. У разі знаходження максимуму чисел ми можемо скористатися варіантом beow:max (num1, num2, num3, *args[, key])
max()сорт. У моєму випадку я використовував інше, key=os.path.basenameоскільки назви файлів мали в них часові позначки.
Мені не вистачає репутації для коментування, але час з відповіді Марлона Абейконса не дав мені правильного результату. Використання mtime, однак, і трюк. (ключ = os.path.get м час))
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 () в unix-системі
(Відредаговано для вдосконалення відповіді)
Спочатку визначте функцію get_latest_file
def get_latest_file(path, *paths):
fullpath = os.path.join(path, paths)
...
get_latest_file('example', 'files','randomtext011.*.txt')
Ви також можете використовувати docstring!
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. Будь ласка, оцініть ефективність рішення перед тим, як подавати претензії на нього.
Я використовував це в 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)