2011-07-21 10 views
86

He escrito el siguiente código Python:¿Cómo se pide Pythons glob.glob?

#!/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 

Ahora me sale esto:

/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 qué manera se solicita?

Podría ayudar a conseguir mis salida de 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 

No está ordenada por nombre de archivo o el tamaño.

Otros enlaces: glob, ls

+2

La respuesta final parece ser que el comando 'ls' sí ordena los archivos por nombre. 'ls -U' proporciona una lista desordenada de archivos en "orden de directorio". –

Respuesta

55

probablemente no es en absoluto ordenados y utiliza el orden en el que aparecen las entradas en el sistema de archivos, es decir, la que se obtiene cuando se utiliza ls -U. (Al menos en mi máquina esto produce el mismo orden que el listado glob coincidencias).

11

glob.glob() es un contenedor alrededor de os.listdir() por lo que el SO subyacente se encarga de entregar los datos. En general: no puede hacer una suposición sobre el orden aquí. La suposición básica es: no ordenando. Si necesita alguna clasificación: ordenar en el nivel de la aplicación.

34

Al marcar el código fuente de glob.glob ves que se llama internamente os.listdir, se describe aquí:

http://docs.python.org/library/os.html?highlight=os.listdir#os.listdir

frase clave: os.listdir (ruta) Devuelve una lista que contiene los nombres de las entradas en el directorio dado por ruta. La lista está en orden arbitrario. No incluye las entradas especiales '.' y '..' incluso si están presentes en el directorio.

Orden arbitraria. :) Solicitar

215

es arbitrario, pero se les puede clasificar mismo

Si desea Clasificación por nombre:

sorted(glob.glob('*.png')) 

ordenados por fecha de modificación:

import os 
sorted(glob.glob('*.png'), key=os.path.getmtime) 

ordenados por tamaño:

import os 
sorted(glob.glob('*.png'), key=os.path.getsize) 

etc.

+0

que tienen archivos, donde los nombres son sólo números enteros, sin extensión, así que uso: 'archivos = glob.glob ('Teksty/*')'. ¿Será el orden por nam concedido? – andi

+7

1 para responder a la pregunta OP realmente se quiere decir que pedir :) – mgalgs

+0

@gnibbler que son mi héroe –

-3
'''my file name is 
"0_male_0.wav", "0_male_2.wav"... "0_male_30.wav"... 
"1_male_0.wav", "1_male_2.wav"... "1_male_30.wav"... 
"8_male_0.wav", "8_male_2.wav"... "8_male_30.wav" 

when I wav.read(files) I want to read them in a sorted torder, i.e., "0_male_0.wav" 
"0_male_1.wav" 
"0_male_2.wav" ... 
"0_male_30.wav" 
"1_male_0.wav" 
"1_male_1.wav" 
"1_male_2.wav" ... 
"1_male_30.wav" 
so this is how I did it. 

Just take all files start with "0_*" as an example. Others you can just put it in a loop 
''' 

import scipy.io.wavfile as wav 
import glob 
from os.path import isfile, join 

#get all the file names in file_names. THe order is totally messed up 
file_names = [f for f in listdir(audio_folder_dir) if isfile(join(audio_folder_dir, f)) and '.wav' in f] 
#find files that belongs to "0_*" group 
filegroup0 = glob.glob(audio_folder_dir+'/0_*') 
#now you get sorted files in group '0_*' by the last number in the filename 
filegroup0 = sorted(filegroup0, key=getKey) 

def getKey(filename): 
    file_text_name = os.path.splitext(os.path.basename(filename)) #you get the file's text name without extension 
    file_last_num = os.path.basename(file_text_name[0]).split('_') #you get three elements, the last one is the number. You want to sort it by this number 
    return int(file_last_num[2]) 

Así es como hice mi caso particular. Espero que sea útil.

+1

Debe cambiar su respuesta para que se ajuste a la pregunta. – CodenameLambda

+1

La pregunta no es sobre clasificación. Sé (y sabía entonces) cómo ordenar. La pregunta es sobre el orden predeterminado. –

+1

Gracias por este fragmento de código, que puede proporcionar ayuda inmediata. Una explicación adecuada [mejoraría en gran medida] (// meta.stackexchange.com/q/114762) su valor educativo, mostrando por qué * * esto es una buena solución al problema, y ​​lo haría más útil para los futuros lectores con semejante, pero no idénticas, preguntas. Por favor [edite] su respuesta para agregar una explicación y dar una indicación de qué limitaciones y suposiciones se aplican. –

2

Tuve un problema similar, glob devolviendo una lista de nombres de archivos en un orden arbitrario, pero quería pasar por ellos en orden numérico como lo indica el nombre del archivo.Así es como lo logré:

Mis archivos fueron devueltos por glob algo como:

myList = ["c:\tmp\x\123.csv", "c:\tmp\x\44.csv", "c:\tmp\x\101.csv", "c:\tmp\x\102.csv", "c:\tmp\x\12.csv"] 

I ordenados la lista en su sitio, para ello he creado una función:

def sortKeyFunc(s): 
    return int(os.path.basename(s)[:-4]) 

Este función devuelve la parte numérica del nombre del archivo y convierte a un entero. A continuación, llamé al método de clasificación en la lista como tal:

myList.sort(key=sortKeyFunc) 

Esto devuelve una lista como tal:

["c:\tmp\x\12.csv", "c:\tmp\x\44.csv", "c:\tmp\x\101.csv", "c:\tmp\x\102.csv", "c:\tmp\x\123.csv"] 
Cuestiones relacionadas