Мне нужно получить последний файл папки с помощью 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])
который требует итерации, поэтому ваш первый параметр должен быть итерируемым. В случае нахождения максимального числа мы можем использовать следующий вариант:max (num1, num2, num3, *args[, key])
max()сорт. В моем случае я использовал другое, key=os.path.basenameпоскольку в именах файлов были временные метки.
Попробуйте отсортировать предметы по времени создания. Пример ниже сортирует файлы в папке и получает первый элемент, который является последним.
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]
У меня нет репутации, чтобы комментировать, но ответ Марлона Абейкуна не дал мне правильного результата. Однако использование mtime помогает. (ключ = 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 () в системе unix
(Отредактировано для улучшения ответа)
Сначала определите функцию 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,05 с), вызовите сценарий летучей мыши, который делает это:
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)