Мне нужно получить последний файл папки, используя 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
max(files, key = os.path.getctime)
- довольно неполный код. Что такое files
? Вероятно, это список имен файлов, выходящих из os.listdir()
.
Но в этом списке перечислены только имена файлов (a. k. a. "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])
который нуждается в повторении, поэтому ваш первый параметр должен быть повторяемым.
В случае нахождения максимума чисел мы можем использовать следующий вариант: 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')
Вы также можете использовать 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
Я попытался использовать приведенные выше предложения, и моя программа потерпела крах, после чего я выяснил, был ли использован файл, который я пытаюсь идентифицировать, и при попытке использовать "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
- нет.
Используйте stdout.decode("utf-8").rstrip()
, чтобы получить пригодное для использования строковое представление имени файла.