Eu escrevi o seguinte código Python:
#!/usr/bin/python
# -*- coding: utf-8 -*-
import os, glob
path = '/home/my/path'
for infile in glob.glob( os.path.join(path, '*.png') ):
print infile
Agora eu entendi:
/home/my/path/output0352.png
/home/my/path/output0005.png
/home/my/path/output0137.png
/home/my/path/output0202.png
/home/my/path/output0023.png
/home/my/path/output0048.png
/home/my/path/output0069.png
/home/my/path/output0246.png
/home/my/path/output0071.png
/home/my/path/output0402.png
/home/my/path/output0230.png
/home/my/path/output0182.png
/home/my/path/output0121.png
/home/my/path/output0104.png
/home/my/path/output0219.png
/home/my/path/output0226.png
/home/my/path/output0215.png
/home/my/path/output0266.png
/home/my/path/output0347.png
/home/my/path/output0295.png
/home/my/path/output0131.png
/home/my/path/output0208.png
/home/my/path/output0194.png
De que maneira é pedido?
Pode ajudá-lo a obter minha saída ls -l:
-rw-r--r-- 1 moose moose 627669 2011-07-17 17:26 output0005.png
-rw-r--r-- 1 moose moose 596417 2011-07-17 17:26 output0023.png
-rw-r--r-- 1 moose moose 543639 2011-07-17 17:26 output0048.png
-rw-r--r-- 1 moose moose 535384 2011-07-17 17:27 output0069.png
-rw-r--r-- 1 moose moose 543216 2011-07-17 17:27 output0071.png
-rw-r--r-- 1 moose moose 561776 2011-07-17 17:27 output0104.png
-rw-r--r-- 1 moose moose 501865 2011-07-17 17:27 output0121.png
-rw-r--r-- 1 moose moose 547144 2011-07-17 17:27 output0131.png
-rw-r--r-- 1 moose moose 530596 2011-07-17 17:27 output0137.png
-rw-r--r-- 1 moose moose 532567 2011-07-17 17:27 output0182.png
-rw-r--r-- 1 moose moose 553562 2011-07-17 17:27 output0194.png
-rw-r--r-- 1 moose moose 574065 2011-07-17 17:27 output0202.png
-rw-r--r-- 1 moose moose 552197 2011-07-17 17:27 output0208.png
-rw-r--r-- 1 moose moose 559809 2011-07-17 17:27 output0215.png
-rw-r--r-- 1 moose moose 549046 2011-07-17 17:27 output0219.png
-rw-r--r-- 1 moose moose 566661 2011-07-17 17:27 output0226.png
-rw-r--r-- 1 moose moose 561678 2011-07-17 17:27 output0246.png
-rw-r--r-- 1 moose moose 525550 2011-07-17 17:27 output0266.png
-rw-r--r-- 1 moose moose 565715 2011-07-17 17:27 output0295.png
-rw-r--r-- 1 moose moose 568381 2011-07-17 17:28 output0347.png
-rw-r--r-- 1 moose moose 532768 2011-07-17 17:28 output0352.png
-rw-r--r-- 1 moose moose 535818 2011-07-17 17:28 output0402.png
Não está ordenado por nome de arquivo ou tamanho.
ls
próprio comando classifica os arquivos por nome. 'ls -U' fornece uma lista não ordenada de arquivos em "ordem de diretório".os.listdir
: * O nix OS retorna arquivos em uma ordem não alfabética e (vergonha de me surpreender!) Isso está explícito na documentação : "A lista está em ordem arbitrária".Respostas:
Provavelmente não está classificado e usa a ordem em que as entradas aparecem no sistema de arquivos, ou seja, a que você obtém ao usar
ls -U
. (Pelo menos na minha máquina, isso produz a mesma ordem que asglob
correspondências da lista ).fonte
A ordem é arbitrária, mas você mesmo pode classificá-las
Se você deseja classificar por nome:
classificados por tempo de modificação:
ordenado por tamanho:
etc.
fonte
files = glob.glob('teksty/*')
. A ordem pelo nome será concedida?Ao verificar o código-fonte,
glob.glob
você vê que ele chama internamenteos.listdir
, descrito aqui:http://docs.python.org/library/os.html?highlight=os.listdir#os.listdir
Sentença chave: os.listdir (caminho) Retorna uma lista contendo os nomes das entradas no diretório fornecido por caminho. A lista está em ordem arbitrária. Não inclui as entradas especiais '.' e '..' mesmo se eles estiverem presentes no diretório
Ordem arbitrária . :)
fonte
glob.glob () é um invólucro em torno do os.listdir (), portanto o SO subjacente é responsável pela entrega dos dados. Em geral: você não pode fazer uma suposição sobre a encomenda aqui. A suposição básica é: sem pedidos. Se você precisar de uma classificação: classifique no nível do aplicativo.
fonte
A ordem é arbitrária, mas existem várias maneiras de classificá-las. Um deles é o seguinte:
fonte
natsort
:from natsort import natsorted; files = natsorted(files)
.Eu tive um problema semelhante,
glob
estava retornando uma lista de nomes de arquivos em uma ordem arbitrária, mas queria percorrê-los em ordem numérica, conforme indicado pelo nome do arquivo. Foi assim que consegui:Meus arquivos foram retornados por
glob
algo como:Classifiquei a lista no lugar, para isso, criei uma função:
Essa função retorna a parte numérica do nome do arquivo e é convertida em um número inteiro. Em seguida, chamei o método de classificação na lista como tal:
Isso retornou uma lista como tal:
fonte
os.path.splitext(os.path.basename(s))[0]
vez deos.path.basename(s)[:-4]
, então a definição da função será.def sortKeyFunc(s): return int(os.path.splitext(os.path.basename(s))[0])
Se você está se perguntando o que o glob.glob fez no seu sistema no passado e não pode adicionar uma
sorted
chamada, a ordem será consistente nos sistemas de arquivos Mac HFS + e a ordem transversal em outros sistemas Unix. Portanto, provavelmente será determinístico, a menos que o sistema de arquivos subjacente tenha sido reorganizado, o que pode acontecer se os arquivos forem adicionados, removidos, renomeados, excluídos, movidos, etc.fonte
Na solução de @Johan La Rooy, classificar as imagens usando
sorted(glob.glob('*.png'))
não funciona para mim, a lista de saída ainda não está ordenada por seus nomes.No entanto, isso
sorted(glob.glob('*.png'), key=os.path.getmtime)
funciona perfeitamente.Estou um pouco confuso, como a classificação por seus nomes não funciona aqui.
Obrigado a @Martin Thoma por postar esta ótima pergunta e a @Johan La Rooy pelas soluções úteis.
fonte
Por favor, tente este código:
fonte
Foi assim que fiz meu caso particular. Espero que seja útil.
fonte