Ho bisogno di ottenere l'ultimo file di una cartella utilizzando Python. Durante l'utilizzo del codice:
max(files, key = os.path.getctime)
Ricevo l'errore seguente:
FileNotFoundError: [WinError 2] The system cannot find the file specified: 'a'
Ho bisogno di ottenere l'ultimo file di una cartella utilizzando Python. Durante l'utilizzo del codice:
max(files, key = os.path.getctime)
Ricevo l'errore seguente:
FileNotFoundError: [WinError 2] The system cannot find the file specified: 'a'
Risposte:
Qualunque cosa sia assegnata alla filesvariabile non è corretta. Usa il codice seguente.
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.Pathoggetti più che con stringhe e os.path. Con pathlib.Path oggetti la tua risposta diventa: list_of_paths = folder_path.glob('*'); latest_path = max(list_of_paths, key=lambda p: p.stat().st_ctime)
os.path.getctimecome chiave, anche con Pathoggetti.
max(files, key = os.path.getctime)
è un codice abbastanza incompleto. Che cos'è files? Probabilmente è un elenco di nomi di file, provenienti da os.listdir().
Ma questo elenco elenca solo le parti del nome del file (aka "nomi di base"), perché il loro percorso è comune. Per usarlo correttamente, devi combinarlo con il percorso che conduce ad esso (e utilizzato per ottenerlo).
Ad esempio (non testato):
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')nella lista di comprensione.
Suggerirei di utilizzare al glob.iglob()posto di glob.glob(), poiché è più efficiente.
glob.iglob () Restituisce un iteratore che restituisce gli stessi valori di glob () senza memorizzarli tutti contemporaneamente.
Che significa glob.iglob() che sarà più efficiente.
Uso principalmente il codice seguente per trovare l'ultimo file corrispondente al mio modello:
LatestFile = max(glob.iglob(fileNamePattern),key=os.path.getctime)
NOTA: ci sono varianti di maxfunzione, in caso di trovare il file più recente useremo la seguente variante:
max(iterable, *[, key, default])
che necessita di iterabilità, quindi il tuo primo parametro dovrebbe essere iterabile. In caso di trovare il numero massimo di numeri possiamo usare la variante beow:max (num1, num2, num3, *args[, key])
max()tipo. Nel mio caso, ho usato un diverso key=os.path.basenamepoiché i nomi dei file avevano timestamp.
Prova a ordinare gli elementi in base all'ora di creazione. L'esempio seguente ordina i file in una cartella e ottiene il primo elemento che è l'ultimo.
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]
Mi manca la reputazione per commentare ma il tempo della risposta di Marlon Abeykoons non ha dato il risultato corretto per me. Usare mtime però fa il trucco. (chiave = os.path.get m time))
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
Ho trovato due risposte per quel problema:
python os.path.getctime max non restituisce l'ultima differenza tra python - getmtime () e getctime () nel sistema unix
(Modificato per migliorare la risposta)
Definisci prima una funzione get_latest_file
def get_latest_file(path, *paths):
fullpath = os.path.join(path, paths)
...
get_latest_file('example', 'files','randomtext011.*.txt')
Puoi anche usare una 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)
Se usi Python 3 , puoi invece usare iglob .
Codice completo per restituire il nome del file più recente:
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_VPNparte?
Ho provato a utilizzare i suggerimenti di cui sopra e il mio programma si è bloccato, poi ho capito che il file che sto cercando di identificare è stato utilizzato e quando ho provato a utilizzare 'os.path.getctime' si è bloccato. quello che alla fine ha funzionato per me è stato:
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,'*'))))
questo codice ottiene l'oggetto insolito tra i due gruppi di elenchi di file non è il piùelegante, e se vengono creati più file contemporaneamente probabilmente non sarà stabile
Un metodo molto più veloce su Windows (0.05s), chiama uno script bat che fa questo:
get_latest.bat
@echo off
for /f %%i in ('dir \\directory\in\question /b/a-d/od/t:c') do set LAST=%%i
%LAST%
dov'è \\directory\in\questionla directory che desideri esaminare.
get_latest.py
from subprocess import Popen, PIPE
p = Popen("get_latest.bat", shell=True, stdout=PIPE,)
stdout, stderr = p.communicate()
print(stdout, stderr)
se trova un file stdoutè il percorso estderr è Nessuno.
Utilizzare stdout.decode("utf-8").rstrip()per ottenere la rappresentazione di stringa utilizzabile del nome file.
ls -Art | tail -n 1. Si prega di valutare le prestazioni di una soluzione prima di fare reclami in merito.
L'ho usato in Python 3, incluso il pattern matching sul nome del file.
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)