2012-08-23 11 views
20

폴더에 file9.txt, file10.txt 및 file11.txt 세 개의 파일이 있는데이 특정 순서로 읽으 려합니다. 아무도 이것으로 나를 도울 수 있습니까?파이썬에서 특정 순서로 파일 읽기

는 지금은 코드

import glob, os 
for infile in glob.glob(os.path.join('*.txt')): 
    print "Current File Being Processed is: " + infile 

를 사용하고 있으며 다음 file11.txt 다음 file9.txt 첫번째 file10.txt를 읽습니다.

누군가 올바른 순서를 얻는 방법을 알려 줄 수 있습니까?

답변

41

파일 시스템의 파일은 정렬되지 않습니다. 사용 결과 파일 이름을 직접 분류 할 수 있습니다 sorted() function :

for infile in sorted(glob.glob('*.txt')): 
    print "Current File Being Processed is: " + infile 

코드에서 os.path.join 호출이 어떤 조합 없다는 것을 참고; 하나의 인수만으로는 아무것도하지 않고 그 인수를 변경하지 않고 반환합니다.

파일은 알파벳 순으로 정렬되며, 109 앞에옵니다. 당신은 정렬을 개선하기 위해 사용자 정의 키 기능을 사용할 수 있습니다

import re 
numbers = re.compile(r'(\d+)') 
def numericalSort(value): 
    parts = numbers.split(value) 
    parts[1::2] = map(int, parts[1::2]) 
    return parts 

for infile in sorted(glob.glob('*.txt'), key=numericalSort): 
    print "Current File Being Processed is: " + infile 

numericalSort 기능은 실제 숫자로 바뀝니다, 파일 이름에 임의의 숫자를 분할하고, 정렬 결과를 반환

>>> files = ['file9.txt', 'file10.txt', 'file11.txt', '32foo9.txt', '32foo10.txt'] 
>>> sorted(files) 
['32foo10.txt', '32foo9.txt', 'file10.txt', 'file11.txt', 'file9.txt'] 
>>> sorted(files, key=numericalSort) 
['32foo9.txt', '32foo10.txt', 'file9.txt', 'file10.txt', 'file11.txt'] 
+0

HI. 정렬 된 함수는 불행히도 순서를 변경하지 않습니다. – user1620012

+0

@ user1620012 : 내 대답을 업데이트하여 정렬 순서를 개선했습니다. –

+0

안녕하세요. 실제로 내 파일의 이름은 .. text-text9-text.txt, text-text10-text.txt 등입니다. – user1620012

6

glob.glob(...) 표현식을 sorted(...) 문 안에 넣고 결과 파일 목록을 정렬 할 수 있습니다. 예 :

for infile in sorted(glob.glob('*.txt')): 

당신은 더 나은 sorted에게 비교 기능을 제공하거나 할 수는 그것을 정렬에 사용되는 사용자 정의 키를 제공하기 위해 key= ... 인수를 사용합니다.

예 :

가 다음 파일은 다음과 같습니다

x/blub01.txt 
x/blub02.txt 
x/blub10.txt 
x/blub03.txt 
y/blub05.txt 

다음과 같은 출력을 생성합니다 다음 코드 :

def key_func(x): 
     return os.path.split(x)[-1] 
for filename in sorted(glob.glob('[xy]/*.txt'), key=key_func): 
     print filename 
# x/blub01.txt 
# x/blub02.txt 
# x/blub03.txt 
# y/blub05.txt 
# x/blub10.txt 
: 키 기능 이제

for filename in sorted(glob.glob('[xy]/*.txt')): 
     print filename 
# x/blub01.txt 
# x/blub02.txt 
# x/blub03.txt 
# x/blub10.txt 
# y/blub05.txt 

편집 : 는 아마도이 키 기능은 파일을 정렬 할 수는 :

pat=re.compile("(\d+)\D*$") 
... 
def key_func(x): 
     mat=pat.search(os.path.split(x)[-1]) # match last group of digits 
     if mat is None: 
      return x 
     return "{:>10}".format(mat.group(1)) # right align to 10 digits. 

그것은 확실히 개선 될 수 있지만, 난 당신이 포인트를 얻을 생각합니다. 숫자가없는 경로는 홀로 남겨지며 숫자가있는 경로는 10 자리의 문자열로 변환되어 숫자를 포함합니다.

+0

정렬 된 함수는 불행히도 순서를 변경하지 않습니다. – user1620012

+0

''blub05.txt'가'blub10.txt'의 앞에 있기 때문에'y/blub05.txt'가 마지막 위치에서 위로 이동합니다. 'key_func'에서 디렉토리없이 파일 이름 만 비교됩니다. – hochl

+0

사실 내 파일에는 0이 없습니다. x/blub1.txt x/blub2.txt x/blub10.txt로 바뀌며 sort 명령을 사용하더라도 잘못된 순서로 나타납니다. x/blub3.txt y/blub5.txt – user1620012

-1
for fname in ['file9.txt','file10.txt','file11.txt']: 
    with open(fname) as f: # default open mode is for reading 
     for line in f: 
     # do something with line 
+0

실제로 처리 할 파일이 몇 군데 있습니다. 목록을 작성하는 것은 매우 불편합니다. – user1620012

0
glob.glob(os.path.join('*.txt')) 

은 문자열 목록을 반환하므로 비단뱀 sorted() function을 사용하여 쉽게 목록을 정렬 할 수 있습니다.

sorted(glob.glob(os.path.join('*.txt'))) 
+0

정렬 된 함수는 동일한 결과를 제공합니다. 현재 처리중인 파일 : file10.txt.txt 처리중인 현재 파일 : file11.txt.txt 현재 처리중인 파일 : file9.txt.txt – user1620012

0

파일 이름에 숫자를 분리하여 'ASCIIBetical'에서 'numeric'로 정렬을 변경해야합니다. 다음과 같이 할 수 있습니다 :

import re 

def keyFunc(afilename): 
    nondigits = re.compile("\D") 
    return int(nondigits.sub("", afilename)) 

filenames = ["file10.txt", "file11.txt", "file9.txt"] 

for x in sorted(filenames, key=keyFunc): 
    print xcode here 

여기서 glob.glob ("*. txt") 결과로 파일 이름을 설정할 수 있습니다.

추가적으로 keyFunc 함수는 파일 이름에 숫자가 들어 있고 숫자는 파일 이름에만 있다고 가정합니다. 정렬 할 필요가있는 번호를 분리하는 데 필요한만큼 복잡하게 기능을 변경할 수 있습니다.

+0

다른 파일 이름이 숫자로 그룹화되어 있습니까? 전의. 'foo1.txt','foo2.txt' ..'foo10.txt','bar1.txt','bar2.txt' 등? 또는 파일 이름에 두 세트의 숫자가 있습니까? –

+0

@MartijnPieters : 그건 원래의 질문에 대한 요구 사항이 아니었고 나는 그 대답을 알고 있다고 생각합니다. :) – grieve

+0

글쎄, 대부분의 질문은 파일의 작은 샘플을 사용 가능성이 높습니다; '9', '10', '11'시퀀스가 중요한 부분이었습니다. 여기에 전체 그림이 있다고 가정 할 수는 없습니다. :-) –