Preciso obter o arquivo mais recente de uma pasta usando python. Enquanto estiver usando o código:
max(files, key = os.path.getctime)
Estou recebendo o erro abaixo:
FileNotFoundError: [WinError 2] The system cannot find the file specified: 'a'
python
python-3.x
python-2.7
garlapak
fonte
fonte
Respostas:
O que for atribuído à
files
variável está incorreto. Use o seguinte código.fonte
if os.path.isdir(latest_file):
pathlib.Path
objetos mais do que strings e os.path. Com pathlib.Path objetos sua resposta torna-se:list_of_paths = folder_path.glob('*'); latest_path = max(list_of_paths, key=lambda p: p.stat().st_ctime)
os.path.getctime
como chave, mesmo comPath
objetos.é um código bastante incompleto. O que é
files
? Provavelmente é uma lista de nomes de arquivos, saindo deos.listdir()
.Mas esta lista lista apenas as partes do nome do arquivo (também conhecidas como "nomes de base"), porque seu caminho é comum. Para usá-lo corretamente, você deve combiná-lo com o caminho que leva a ele (e usado para obtê-lo).
Como (não testado):
fonte
if basename.endswith('.csv')
na lista de compreensão.Eu sugeriria usar em
glob.iglob()
vez deglob.glob()
, pois é mais eficiente.Que significa
glob.iglob()
que será mais eficiente.Geralmente uso o código abaixo para encontrar o arquivo mais recente correspondente ao meu padrão:
LatestFile = max(glob.iglob(fileNamePattern),key=os.path.getctime)
NOTA: Existem variantes de
max
função. No caso de encontrar o arquivo mais recente, usaremos a variante abaixo:max(iterable, *[, key, default])
que precisa ser iterável, portanto seu primeiro parâmetro deve ser iterável. No caso de encontrar o máximo de nums, podemos usar a variante beow:
max (num1, num2, num3, *args[, key])
fonte
max()
tipo. No meu caso, usei um diferente,key=os.path.basename
pois os nomes dos arquivos tinham registros de data e hora.Tente classificar itens por hora de criação. O exemplo abaixo classifica os arquivos em uma pasta e obtém o primeiro elemento mais recente.
fonte
Não tenho a reputação de comentar, mas o ctime da resposta de Marlon Abeykoons não deu o resultado correto para mim. Usar o mtime faz o truque. (chave = os.path.get m tempo))
Encontrei duas respostas para esse problema:
python os.path.getctime max não retorna a última diferença entre python - getmtime () e getctime () no sistema unix
fonte
(Editado para melhorar a resposta)
Primeiro defina uma função get_latest_file
Você também pode usar uma docstring!
Se você usa o Python 3 , pode usar o iglob .
Código completo para retornar o nome do arquivo mais recente:
fonte
JuniperAccessLog-standalone-FCL_VPN
papel?Eu tentei usar as sugestões acima e meu programa travou, então eu descobri que o arquivo que estou tentando identificar foi usado e ao tentar usar 'os.path.getctime' ele travou. o que finalmente funcionou para mim foi:
esse código obtém o objeto incomum entre os dois conjuntos de listas de arquivos não é o mais elegante e, se vários arquivos forem criados ao mesmo tempo, provavelmente não será estável
fonte
Um método muito mais rápido no Windows (0.05s), chame um script bat que faça isso:
get_latest.bat
onde
\\directory\in\question
é o diretório que você deseja investigar.get_latest.py
se encontrar um arquivo
stdout
é o caminho estderr
é Nenhum.Use
stdout.decode("utf-8").rstrip()
para obter a representação de sequência utilizável do nome do arquivo.fonte
ls -Art | tail -n 1
. Avalie o desempenho de uma solução antes de fazer reivindicações sobre ela.Eu tenho usado isso no Python 3, incluindo correspondência de padrões no nome do arquivo.
fonte