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'
python
python-3.x
python-2.7
garlapak
fuente
fuente
Respuestas:
Todo lo que se asigna a la
files
variable es incorrecto. Utilice el siguiente código.fuente
if os.path.isdir(latest_file):
pathlib.Path
objetos 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.getctime
como clave, incluso conPath
objetos.es un código bastante incompleto. ¿Qué es
files
? Probablemente sea una lista de nombres de archivos de la que se saleos.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):
fuente
if basename.endswith('.csv')
en la lista de comprensión.Sugeriría usar en
glob.iglob()
lugar deglob.glob()
, ya que es más eficiente.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])
fuente
max()
tipo. En mi caso, utilicé uno diferentekey=os.path.basename
ya 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.
fuente
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))
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
fuente
(Editado para mejorar la respuesta)
Primero defina una función get_latest_file
¡También puede usar una cadena de documentos!
Si usa Python 3 , puede usar iglob en su lugar.
Código completo para devolver el nombre del último archivo:
fuente
JuniperAccessLog-standalone-FCL_VPN
pieza?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:
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
fuente
Un método mucho más rápido en Windows (0.05s), llame a un script bat que haga esto:
get_latest.bat
dónde
\\directory\in\question
está el directorio que desea investigar.get_latest.py
si encuentra un archivo
stdout
es la ruta ystderr
es Ninguno.Úselo
stdout.decode("utf-8").rstrip()
para obtener la representación de cadena utilizable del nombre del archivo.fuente
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.
fuente