Подтвердить что ты не робот

Как получить последний файл в папке с помощью python

Мне нужно получить последний файл папки, используя Python. При использовании кода:

max(files, key = os.path.getctime)

Я получаю сообщение об ошибке ниже:

FileNotFoundError: [WinError 2] The system cannot find the file specified: 'a'

4b9b3361

Ответ 1

Все, что назначено переменной 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

Ответ 2

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)

Ответ 3

Попробуйте сортировать элементы по времени создания. Пример ниже сортирует файлы в папке и получает первый элемент, который является последним.

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]

Ответ 4

Я бы предложил использовать 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])

Ответ 5

(Отредактировано для улучшения ответа)

Сначала определите функцию 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

Ответ 6

Я попытался использовать приведенные выше предложения, и моя программа потерпела крах, после чего я выяснил, был ли использован файл, который я пытаюсь идентифицировать, и при попытке использовать "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,'*'))))

этот код получает необычный объект между двумя наборами списков файлов это не самый элегантный, и если несколько файлов создаются одновременно, это, вероятно, не будет стабильным

Ответ 7

Гораздо более быстрый метод для 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(), чтобы получить пригодное для использования строковое представление имени файла.