Qual é a melhor maneira de obter uma lista de todos os arquivos em um diretório, classificados por data [criada | modificado], usando python, em uma máquina Windows?
129
Atualização : para classificar dirpath
as entradas por data de modificação no Python 3:
import os
from pathlib import Path
paths = sorted(Path(dirpath).iterdir(), key=os.path.getmtime)
(coloque a resposta da @ Pygirl aqui para maior visibilidade)
Se você já possui uma lista de nomes de arquivos files
, classifique-a no local pela hora da criação no Windows:
files.sort(key=os.path.getctime)
A lista de arquivos que você pode obter, por exemplo, usando glob
como mostrado na resposta de @ Jay .
resposta antiga
Aqui está uma versão mais detalhada da @Greg Hewgill
resposta de . É o mais compatível com os requisitos da pergunta. Faz uma distinção entre datas de criação e modificação (pelo menos no Windows).
#!/usr/bin/env python
from stat import S_ISREG, ST_CTIME, ST_MODE
import os, sys, time
# path to the directory (relative or absolute)
dirpath = sys.argv[1] if len(sys.argv) == 2 else r'.'
# get all entries in the directory w/ stats
entries = (os.path.join(dirpath, fn) for fn in os.listdir(dirpath))
entries = ((os.stat(path), path) for path in entries)
# leave only regular files, insert creation date
entries = ((stat[ST_CTIME], path)
for stat, path in entries if S_ISREG(stat[ST_MODE]))
#NOTE: on Windows `ST_CTIME` is a creation date
# but on Unix it could be something else
#NOTE: use `ST_MTIME` to sort by a modification date
for cdate, path in sorted(entries):
print time.ctime(cdate), os.path.basename(path)
Exemplo:
$ python stat_creation_date.py
Thu Feb 11 13:31:07 2009 stat_creation_date.py
cdate
é um número flutuante de segundos desde a época.stat
uma vez por dir.entry.Eu fiz isso no passado para um script Python para determinar os últimos arquivos atualizados em um diretório:
Isso deve fazer o que você procura com base no arquivo mtime.
EDIT : Observe que você também pode usar os.listdir () no lugar de glob.glob (), se desejar - a razão pela qual usei glob no meu código original foi porque estava querendo usar glob para procurar apenas arquivos com um conjunto específico de extensões de arquivo, para qual glob () era mais adequado. Para usar o listdir, veja como seria:
fonte
files.sort(key=lambda fn: os.path.getmtime(os.path.join(search_dir, fn)))
files.sort(key=os.path.getmtime)
deve funcionar (semlambda
).Há uma
os.path.getmtime
função que fornece o número de segundos desde a época e deve ser mais rápida queos.stat
.fonte
Aqui está a minha versão:
Primeiro, criamos uma lista dos nomes dos arquivos. isfile () é usado para pular diretórios; pode ser omitido se diretórios devem ser incluídos. Em seguida, classificamos a lista no local, usando a data de modificação como chave.
fonte
a[-5:]
Aqui está uma frase:
Isso chama os.listdir () para obter uma lista dos nomes de arquivos e, em seguida, chama os.stat () para que cada um obtenha o tempo de criação e depois classifica o tempo de criação.
Observe que esse método chama os.stat () apenas uma vez para cada arquivo, o que será mais eficiente do que chamá-lo para cada comparação em uma classificação.
fonte
Sem alterar o diretório:
fonte
Em python 3.5 ou superior
fonte
f.stat().st_ctime
lugar.Aqui está minha resposta usando glob sem filtro, se você quiser ler arquivos com uma certa extensão em ordem de data (Python 3).
fonte
fonte
Você pode usar em
os.walk('.').next()[-1]
vez de filtrar comos.path.isfile
, mas isso deixa links simbólicos mortos na lista eos.stat
falhará neles.fonte
ou
ou
onde m hora é hora modificada.
fonte
este é um passo básico para aprender:
fonte
A resposta de Alex Coventry produzirá uma exceção se o arquivo for um link simbólico para um arquivo inexistente, o código a seguir corrige essa resposta:
Quando o arquivo não existe, now () é usado e o link simbólico irá para o final da lista.
fonte
Aqui estão algumas linhas simples que procuram por extensão e fornecem uma opção de classificação
fonte
Para completar com
os.scandir
(2x mais rápidopathlib
):fonte
Esta foi a minha versão:
fonte
Talvez você deva usar comandos shell. No Unix / Linux, a localização com classificação provavelmente será capaz de fazer o que você deseja.
fonte