2013-07-11 3 views
1

나는 화학 물질 A에서 ​​화학 물질 B로 이동하려고 할 때 검색하는 화학적 경로를 포함하는 큰 (2.2GB) 텍스트로 구분 된 파일이 있습니다. 누군가가 알고 있는지 궁금합니다. 한 행의 열 수로 파일을 정렬 할 수있는 방법 (선호하는 python)?csv를 각 행의 열 수로 정렬

예 :

CSV :

A B C D 
E F G 
H I 
J K L M N 

가 분류해야 : 나는 행 길이와 행의 해시 테이블을 만드는 생각을 해 봤는데

H I 
E F G 
A B C D 
J K L M N 

하지만, CSV 파일로 (우리는 화학 네트워크에서 가장 긴 경로를 실행하고 있고 2.2gb (30mil 경로)는 길이가 < = 10), 나는이 접근법이 가장 빠르지 않을 것으로 예상합니다.

+0

나는 인덱스를 구축하고이를 정렬 할 것입니다. 예를 들어 화학 경로 파일의 각 행에 대해'(length, pointer_to_line)'의 인덱스에 튜플을 만듭니다. 'len (row.split())'만 할 수 있기 때문에 길이가 쉽습니다. 행의 포인터는'f.tell()'등으로 행해질 수가 있습니다. 색인을 정렬하십시오. 일단 정렬되면 화학 경로 파일의 라인을 순서대로 잡아서 새 파일에 쓸 수 있습니다. 편집 : [이 게시물] (http://stackoverflow.com/questions/7079473/sorting-large-text-data) 도움이 될 수 있습니다. – wflynny

+0

첫 번째 반응은 강제로 CSV로 작업하지 않고이 데이터를 데이터베이스에 저장하는 것입니다 (이미 데이터베이스에서 데이터를 읽었을 수도 있습니다). 필요한 경우 데이터베이스의 이점을 누리고 Python + SQL을 사용하여 향후 더 많은 유형의 데이터 분석을 수행 할 수 있습니다. – mdscruggs

답변

5
내가 나중에 함께 다시 합류 한 후, 길이에 따라 별도의 파일로 분할 가고 싶어

- 뭔가를 같이 :

from tempfile import TemporaryFile 
from itertools import chain 

파일의 길이 -> 출력 파일의 참조 딕셔너리를 유지합니다. 파일이 이미 열린 곳에서 파일에 쓰거나 새 임시 파일을 만듭니다. 스티븐 Rumbalski가 지적했듯이

output = {} 
with open('input') as fin: 
    for line in fin: 
     length = len(line.split()) 
     output.setdefault(length, TemporaryFile()).write(line) 

,이 또한 defaultdict으로 수행 할 수 있습니다

from collections import defaultdict 
output = defaultdict(TemporaryFile) 
... 
output[length].write(line) 

임시 파일은 모든 파일의 끝을 가리키는 것입니다. 그들을 통해 읽을 때 우리가 다시 데이터를 얻을 수 있도록

for fh in output.values(): 
    fh.seek(0) 

길이의 증가하는 순서로 각 파일에서 행을 가지고 ... 처음으로 재설정 ... 그리고 최종 출력 파일에 모든 물품.

with open('output', 'w') as fout: 
    fout.writelines(chain.from_iterable(v for k,v in sorted(output.iteritems()))) 

파이썬은 ... 프로그램 종료시 임시 파일을 정리해야합니다

+2

아주 새로운 파이어,, 정말로 새로운 필자에게는 독서가 불가능합니다. 내 생각에 댓글을 달았어야합니다. –

+0

@btoueg에 약간 주석을 달았습니다. 더 이상 필요하다고 생각되면 알려주세요. –

+0

내가 필요한 것! 고마워요. – Darkstarone