Necesito obtener el último archivo de una carpeta usando python. Mientras usa el código:
max(files, key = os.path.getctime)
Recibo el siguiente error:
FileNotFoundError: [WinError 2] The system cannot find the file specified: 'a'
Necesito obtener el último archivo de una carpeta usando python. Mientras usa el código:
max(files, key = os.path.getctime)
Recibo el siguiente error:
FileNotFoundError: [WinError 2] The system cannot find the file specified: 'a'
Respuestas:
Todo lo que se asigna a la filesvariable es incorrecto. Utilice el siguiente código.
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.Pathobjetos más que cadenas y os.path. Con los objetos pathlib.Path, su respuesta se convierte en: list_of_paths = folder_path.glob('*'); latest_path = max(list_of_paths, key=lambda p: p.stat().st_ctime)
os.path.getctimecomo clave, incluso con Pathobjetos.
max(files, key = os.path.getctime)
es un código bastante incompleto. ¿Qué es files? Probablemente sea una lista de nombres de archivos de la que se sale os.listdir().
Pero esta lista enumera solo las partes del nombre de archivo (también conocidas como "nombres de base"), porque su ruta es común. Para usarlo correctamente, debes combinarlo con el camino que lo lleva (y usado para obtenerlo).
Como (no probado):
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')en la lista de comprensión.
Sugeriría usar en glob.iglob()lugar de glob.glob(), ya que es más eficiente.
glob.iglob () Devuelve un iterador que produce los mismos valores que glob () sin almacenarlos todos simultáneamente.
Lo que significa glob.iglob() serán más eficientes.
Utilizo principalmente el siguiente código para encontrar el último archivo que coincida con mi patrón:
LatestFile = max(glob.iglob(fileNamePattern),key=os.path.getctime)
NOTA: Hay variantes de max función, en caso de encontrar el último archivo, usaremos la siguiente variante:
max(iterable, *[, key, default])
que necesita iterable por lo que su primer parámetro debería ser iterable. En caso de encontrar un máximo de números, podemos usar la variante beow:max (num1, num2, num3, *args[, key])
max()tipo. En mi caso, utilicé uno diferente key=os.path.basenameya que los nombres de archivo tenían marcas de tiempo.
Intente ordenar los elementos por hora de creación. El siguiente ejemplo ordena los archivos en una carpeta y obtiene el primer elemento que es el más reciente.
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]
Me falta la reputación para comentar, pero el tiempo de respuesta de Marlon Abeykoon no me dio el resultado correcto. Sin embargo, usar mtime funciona. (clave = 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
Encontré dos respuestas para ese problema:
python os.path.getctime max no devuelve la última diferencia entre python - getmtime () y getctime () en el sistema Unix
(Editado para mejorar la respuesta)
Primero defina una función get_latest_file
def get_latest_file(path, *paths):
fullpath = os.path.join(path, paths)
...
get_latest_file('example', 'files','randomtext011.*.txt')
¡También puede usar una cadena de documentos!
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)
Si usa Python 3 , puede usar iglob en su lugar.
Código completo para devolver el nombre del último archivo:
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_VPNpieza?
Intenté usar las sugerencias anteriores y mi programa se bloqueó, entonces descubrí que se usó el archivo que estoy tratando de identificar y cuando intenté usar 'os.path.getctime' se bloqueó. lo que finalmente funcionó para mí fue:
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,'*'))))
este código obtiene el objeto poco común entre los dos conjuntos de listas de archivos, no es el más elegante, y si se crean varios archivos al mismo tiempo, probablemente no será estable
Un método mucho más rápido en Windows (0.05s), llame a un script bat que haga esto:
get_latest.bat
@echo off
for /f %%i in ('dir \\directory\in\question /b/a-d/od/t:c') do set LAST=%%i
%LAST%
dónde \\directory\in\questionestá el directorio que desea investigar.
get_latest.py
from subprocess import Popen, PIPE
p = Popen("get_latest.bat", shell=True, stdout=PIPE,)
stdout, stderr = p.communicate()
print(stdout, stderr)
si encuentra un archivo stdoutes la ruta ystderr es Ninguno.
Úselo stdout.decode("utf-8").rstrip()para obtener la representación de cadena utilizable del nombre del archivo.
ls -Art | tail -n 1. Evalúe el rendimiento de una solución antes de hacer afirmaciones al respecto.
He estado usando esto en Python 3, incluida la coincidencia de patrones en el nombre del archivo.
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)