Como você começa um diretório anúncio classificado por data de criação em python?

StackOverflow https://stackoverflow.com/questions/168409

  •  03-07-2019
  •  | 
  •  

Pergunta

O que é a melhor maneira de obter uma lista de todos os arquivos em um diretório, ordenadas por data [criado | modificada], usando python, em uma máquina Windows?

Foi útil?

Solução

Aqui está uma versão mais detalhada do o @Greg Hewgill resposta . É a mais em conformidade com os requisitos de interrogação. Ele faz uma distinção entre as 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

Outras dicas

Eu fiz isso no passado para um script Python para determinar os últimos arquivos atualizados em um diretório:

import glob
import os

search_dir = "/mydir/"
# remove anything from the list that is not a file (directories, symlinks)
# thanks to J.F. Sebastion for pointing out that the requirement was a list 
# of files (presumably not including directories)  
files = filter(os.path.isfile, glob.glob(search_dir + "*"))
files.sort(key=lambda x: os.path.getmtime(x))

Isso deve fazer o que você está procurando com base em mtime arquivo.

Editar : Note que você também pode usar os.listdir () no lugar de glob.glob () se desejado - a razão eu usei glob no meu código original foi que eu estava querendo usar glob para buscar apenas os arquivos com um determinado conjunto de extensões de arquivo, que glob () foi mais adequado para. Para uso listDir aqui está o que ele ficaria assim:

import os

search_dir = "/mydir/"
os.chdir(search_dir)
files = filter(os.path.isfile, os.listdir(search_dir))
files = [os.path.join(search_dir, f) for f in files] # add path to each file
files.sort(key=lambda x: os.path.getmtime(x))

Aqui está a minha versão:

def getfiles(dirpath):
    a = [s for s in os.listdir(dirpath)
         if os.path.isfile(os.path.join(dirpath, s))]
    a.sort(key=lambda s: os.path.getmtime(os.path.join(dirpath, s)))
    return a

Em primeiro lugar, construir uma lista dos nomes de arquivo. isfile () é utilizado para saltar directórios; ele pode ser omitido se diretórios devem ser incluídos. Então, nós meio da lista no local, usando a data de modificação como a chave.

Há uma função os.path.getmtime que dá o número de segundos desde a época e deve ser mais rápido do que os.stat.

import os 

os.chdir(directory)
sorted(filter(os.path.isfile, os.listdir('.')), key=os.path.getmtime)

Aqui está uma frase:

import os
import time
from pprint import pprint

pprint([(x[0], time.ctime(x[1].st_ctime)) for x in sorted([(fn, os.stat(fn)) for fn in os.listdir(".")], key = lambda x: x[1].st_ctime)])

Esta os.listdir chamadas () para obter uma lista dos nomes de arquivos, em seguida, chama os.stat () para cada um para obter o tempo de criação, em seguida, classifica contra o tempo de criação.

Note que este método só chama os.stat () uma vez para cada arquivo, que será mais eficiente do que chamá-lo para cada comparação em uma espécie.

Sem alterar diretório:

import os    

path = '/path/to/files/'
name_list = os.listdir(path)
full_list = [os.path.join(path,i) for i in name_list]
time_sorted_list = sorted(full_list, key=os.path.getmtime)

print time_sorted_list

# if you want just the filenames sorted, simply remove the dir from each
sorted_filename_list = [ os.path.basename(i) for i in time_sorted_list]
print sorted_filename_list

Aqui está a minha resposta usando glob sem filtro, se você quiser ler arquivos com uma determinada extensão em ordem de data (Python 3).

dataset_path='/mydir/'   
files = glob.glob(dataset_path+"/morepath/*.extension")   
files.sort(key=os.path.getmtime)

pitão 3,5 +

from pathlib import Path
sorted(Path('.').iterdir(), key=lambda f: f.stat().st_mtime)
sorted(filter(os.path.isfile, os.listdir('.')), 
    key=lambda p: os.stat(p).st_mtime)

Você pode usar os.walk('.').next()[-1] em vez de filtragem com os.path.isfile, mas que deixa links simbólicos mortas na lista, e os.stat falhará sobre eles.

este é um passo fundamental para aprender:

import os, stat, sys
import time

dirpath = sys.argv[1] if len(sys.argv) == 2 else r'.'

listdir = os.listdir(dirpath)

for i in listdir:
    os.chdir(dirpath)
    data_001 = os.path.realpath(i)
    listdir_stat1 = os.stat(data_001)
    listdir_stat2 = ((os.stat(data_001), data_001))
    print time.ctime(listdir_stat1.st_ctime), data_001

A resposta de Alex Coventry irá produzir uma exceção se o arquivo é um link simbólico para um arquivo unexistent, a seguir corrige código que resposta:

import time
import datetime
sorted(filter(os.path.isfile, os.listdir('.')), 
    key=lambda p: os.path.exists(p) and os.stat(p).st_mtime or time.mktime(datetime.now().timetuple())

Quando o arquivo não existe, agora () é usado, e o link simbólico vai no final da lista.

Aqui é um simples linhas casal que procura por extensão, bem como fornece uma opção de classificação

def get_sorted_files(src_dir, regex_ext='*', sort_reverse=False): 
    files_to_evaluate = [os.path.join(src_dir, f) for f in os.listdir(src_dir) if re.search(r'.*\.({})$'.format(regex_ext), f)]
    files_to_evaluate.sort(key=os.path.getmtime, reverse=sort_reverse)
    return files_to_evaluate

Talvez você deve usar comandos shell. Em Unix / Linux, achado canalizada com sorte provavelmente será capaz de fazer o que quiser.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top