Pythons glob.glob는 어떻게 주문됩니까?


199

다음 파이썬 코드를 작성했습니다.

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

이제 나는 이것을 얻는다 :

/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

어떤 방법으로 주문됩니까?

내 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

파일 이름 또는 크기별로 정렬되지 않습니다.

다른 링크 : glob,ls


2
최종 답변은 ls명령 자체가 파일을 이름별로 정렬 하는 것 같습니다 . 'ls -U'는 "디렉토리 순서"로 정렬되지 않은 파일 목록을 제공합니다.
Brian Peterson

2
Windows에서는 정렬되어 있으므로 항상 그렇게 가정했습니다. 이제 Ubuntu에서는 디버깅 비용이 발생했습니다. 자기주의 사항-API를 읽으십시오! : 0)
Yuri Feldman

동작은 다음과 os.listdir같습니다. * nix OS는 알파벳이 아닌 순서로 파일을 반환 하며, 문서에 "목록이 임의의 순서로 있습니다"라고 명시되어 있습니다.
Joël

답변:


112

아마도 전혀 정렬되지 않았으며 파일 시스템에 항목이 나타나는 순서, 즉 사용할 때 얻는 순서를 사용 ls -U합니다. (적어도 내 컴퓨터에서는 리스팅 glob일치와 동일한 순서를 생성합니다 ).


1
그렇습니다. 특별한 노력을 기울이지 않으면 운영 체제에서 제공하는 항목 만 표시됩니다. Unix의 "find"명령과 동일하게, 기본 파일 시스템이 사용하는 데이터 구조에서 순서대로 항목을 덤프합니다. 파일이 작성 순서대로 나타나는 것처럼 보일지라도 순서에 대해 어떤 가정도해서는 안됩니다.
Raúl Salinas-Monteagudo 2014 년

421

순서는 임의적이지만 직접 정렬 할 수 있습니다

이름별로 정렬하려면 :

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

수정 시간별로 정렬 :

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

크기별로 정렬 :

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

기타


1
확장자가없는 이름이 정수 인 파일이 있으므로 다음을 사용하십시오 files = glob.glob('teksty/*'). 남에 의한 주문은 허용됩니까?
andilabs

3
@mgalgs 아니오, 그것은 제가 정말로 물어볼 질문이 아닙니다. 내가 알고 싶은 것은 Xion이 대답했습니다.
Martin Thoma

생성 날짜에 따라 생성 시간에 따라 정렬하는 방법은 무엇입니까? 최신 파일을 먼저 나열하기 때문입니다. 오래된 파일부터 최신 파일까지 어떻게 목록을 얻을 수 있습니까? 감사합니다!
joaquindev

1
getmtime 및 getsize는 상대적으로 비싸다는 점에 유의하십시오. 많은 파일에 대해이 작업을 수행하는 데 다소 시간이 걸릴 수 있습니다.
drevicko

53

소스 코드를 확인하면 다음 과 같이 glob.glob내부적으로 호출 os.listdir됩니다.

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

키 문장 : os.listdir (path) 경로로 지정된 디렉토리에있는 항목의 이름이 포함 된 목록을 반환합니다. 목록은 임의의 순서입니다. 특수 항목 '.'은 포함되지 않습니다. 그리고 디렉토리에 존재하더라도 '..'.

임의 순서 . :)


14

glob.glob ()는 os.listdir ()을 감싸는 래퍼이므로 기본 OS는 데이터 전달을 담당합니다. 일반적으로 여기에서 주문에 대한 가정을 할 수 없습니다. 기본 가정은 : 주문 없음 . 정렬이 필요한 경우 : 응용 프로그램 수준에서 정렬하십시오.


13

순서는 임의적이지만 여러 가지 방법으로 정렬 할 수 있습니다. 그중 하나는 다음과 같습니다.

#First, get the files:
import glob
import re
files =glob.glob1(img_folder,'*'+output_image_format)
# if you want sort files according to the digits included in the filename, you can do as following:
files = sorted(files, key=lambda x:float(re.findall("(\d+)",x)[0]))

기존 답변과 비교하여 귀하의 답변은 무엇입니까?
마틴 토마

2
@MartinThoma 파일에있는 정수가 0으로 채워지지 않으면 파일 이름을 정렬하지 않는 정렬 문제가 있습니다. 정렬은 1000에서 시작하여 가장 높은 정수로 올라간 다음 가장 작은 정수부터 다시 시작합니다. 숫자를 0으로 채우면 파일을 정렬하여 호출하면 완벽하게 정렬됩니다. 따라서이 솔루션은 혼자 정렬해도 작동하지 않을 때 문제를 해결한다고 생각합니다.
Will.Evo

@ Will.Evo natsort:을 사용해보십시오 from natsort import natsorted; files = natsorted(files).
마틴 토마

당신의 대답이 도움이되었습니다!
Vineet

12

비슷한 문제가 발생 glob하여 임의의 순서로 파일 이름 목록을 반환했지만 파일 이름으로 표시된 숫자 순서대로 파일을 단계별로 살펴보고 싶었습니다. 이것이 내가 달성 한 방법입니다.

내 파일은 glob다음과 같이 반환되었습니다 .

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"]

나는 목록을 제자리에 정렬했다. 이것을하기 위해 나는 함수를 만들었다 :

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

이 함수는 파일 이름의 숫자 부분을 반환하고 정수로 변환 한 다음 목록에서 정렬 방법을 다음과 같이 호출했습니다.

myList.sort(key=sortKeyFunc)

이것은 다음과 같은 목록을 반환했습니다.

["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"]

os.path.splitext(os.path.basename(s))[0]대신에 사용하는 것이 더 우아하다고 생각 os.path.basename(s)[:-4]하므로 함수 정의가 가능합니다. def sortKeyFunc(s): return int(os.path.splitext(os.path.basename(s))[0])
ePandit

1

과거에 시스템에 수행 한하고 추가 할 수있는 glob.glob에 대해 궁금해하는 경우 sorted전화를, 순서는에 일치합니다 맥 HFS + 파일 시스템 및됩니다 탐색하기 위해 다른 유닉스 시스템. 따라서 파일이 추가, 제거, 이름 변경, 삭제, 이동 등의 경우 발생할 수있는 기본 파일 시스템이 재구성되지 않으면 결정적 일 수 있습니다.


macOS의 APFS는 어떻습니까?
보리스

0

@Johan La Rooy의 솔루션에서 이미지를 정렬하는 sorted(glob.glob('*.png'))것이 효과가 없지만 출력 목록은 여전히 ​​이름별로 정렬되지 않습니다.

그러나 sorted(glob.glob('*.png'), key=os.path.getmtime)완벽하게 작동합니다.

이름으로 정렬하는 방법이 여기에서 작동하지 않는 방법이 약간 혼란 스럽습니다.

이 훌륭한 질문을 게시 한 @Martin Thoma와 유용한 솔루션에 대한 @Johan La Rooy에게 감사합니다.


-1

이 코드를 시도하십시오 :

sorted(glob.glob( os.path.join(path, '*.png') ),key=lambda x:float(re.findall("([0-9]+?)\.png",x)[0]))

-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])

그게 내가 특정한 경우를 한 방법입니다. 도움이 되길 바랍니다.


1
질문에 맞게 답변을 변경해야합니다.
CodenameLambda

1
문제는 정렬에 관한 것이 아닙니다. 나는 정렬하는 방법을 알고 있습니다. 질문은 기본 순서에 관한 것입니다.
Martin Thoma

1
이 코드 스 니펫에 감사드립니다. 즉각적인 도움이 될 수 있습니다. 적절한 설명 이것이 문제에 대한 좋은 해결책 인지 보여줌으로써 교육적 가치를 크게 향상시킬 것이며 , 유사하지만 동일하지 않은 질문을 가진 미래 독자들에게 더 유용 할 것입니다. 제발 편집 설명을 추가하고, 제한 및 가정이 적용 무엇의 표시를 제공하는 답변을.
Toby Speight
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.