web-dev-qa-db-de.com

So erhalten Sie die neueste Datei in einem Ordner mit Python

ich muss die neueste Datei eines Ordners mit Python abrufen. Bei der Verwendung des Codes:

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

Ich erhalte die folgende Fehlermeldung: 

FileNotFoundError: [WinError 2] Das System kann die angegebene Datei nicht finden: 'a'

55
garlapak

Was der Variablen files zugewiesen ist, ist falsch. Verwenden Sie den folgenden Code.

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
163
Marlon Abeykoon
max(files, key = os.path.getctime)

ist ziemlich unvollständiger Code. Was ist files? Es ist wahrscheinlich eine Liste von Dateinamen, die aus os.listdir() hervorgehen.

In dieser Liste werden jedoch nur die Dateinamen (a. K. A. "Basenames") aufgeführt, da der Pfad häufig ist. Um es richtig zu verwenden, müssen Sie es mit dem Pfad verbinden, der zu ihm führt (und dazu verwendet wurde).

Wie (nicht getestet):

def newest(path):
    files = os.listdir(path)
    paths = [os.path.join(path, basename) for basename in files]
    return max(paths, key=os.path.getctime)
18
glglgl

Ich würde vorschlagen, glob.iglob() anstelle von glob.glob() zu verwenden, da dies effizienter ist.

glob.iglob () Gibt einen Iterator zurück, der dieselben Werte wie glob () liefert, ohne diese gleichzeitig zu speichern.

Was bedeutet, dass glob.iglob() effizienter ist.

Ich verwende meistens den folgenden Code, um die neueste Datei zu finden, die zu meinem Muster passt:

LatestFile = max(glob.iglob(fileNamePattern),key=os.path.getctime)


HINWEIS: Es gibt Varianten der Funktion max. Wenn die neueste Datei gefunden wird, verwenden wir die folgende Variante: max(iterable, *[, key, default])

das muss iterabel sein, sodass Ihr erster Parameter iterabel sein sollte. Wenn Sie maximal eine Zahl finden, können Sie die folgende Variante verwenden: max (num1, num2, num3, *args[, key])

4
BreakBadSP

Versuchen Sie, die Elemente nach Erstellungszeit zu sortieren. Das folgende Beispiel sortiert Dateien in einem Ordner und erhält das erste aktuelle Element.

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
turkus

Rufen Sie als viel schnellere Methode unter Windows (0,05 s) ein bat-Skript auf, das dies ausführt:

get_latest.bat

@echo off
for /f %%i in ('dir \\directory\in\question /b/a-d/od/t:c') do set LAST=%%i
%LAST%

dabei ist \\directory\in\question das Verzeichnis, das Sie untersuchen möchten.

get_latest.py

from subprocess import Popen, PIPE
p = Popen("get_latest.bat", Shell=True, stdout=PIPE,)
stdout, stderr = p.communicate()
print(stdout, stderr)

wenn eine Datei gefunden wird, ist stdout der Pfad und stderr None.

Verwenden Sie stdout.decode("utf-8").rstrip(), um die verwendbare Zeichenfolgendarstellung des Dateinamens abzurufen.

0
ic_fl2

(Zur Verbesserung der Antwort bearbeitet)

Definieren Sie zuerst eine Funktion get_latest_file

def get_latest_file(path, *paths):
    fullpath = os.path.join(path, paths)
    ...
get_latest_file('example', 'files','randomtext011.*.txt')

Sie können auch einen Docstring verwenden!

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)

Wenn Sie Python 3 verwenden, können Sie stattdessen iglob verwenden.

Vollständiger Code, um den Namen der neuesten Datei zurückzugeben:

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
0
Naeem Ul Wahhab

Ich habe versucht, die obigen Vorschläge zu verwenden, und mein Programm stürzte ab, als ich herausfand, dass die Datei, die ich zu identifizieren versuchte, verwendet wurde. Beim Versuch, 'os.path.getctime' zu verwenden, stürzte es ab war:

    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,'*'))))

dieser Code ruft das ungewöhnliche Objekt zwischen den beiden Dateilistengruppen auf. __ es ist nicht das eleganteste, und wenn mehrere Dateien gleichzeitig erstellt werden, ist es wahrscheinlich nicht stabil

0
AlexFink