2011-12-09 2 views
6

큰 데이터를 다루므로 데이터를 읽는 좋은 방법을 찾는 것이 정말로 중요합니다. 나는 다른 독서 방법에 대해 조금 혼란스러워합니다.파이썬에서 큰 데이터를 읽는 다른 방법

1.f=gzip.open(file,'r') 
     for line in f: 
      process line 
    #how can I process nth line? can I? 
2.f=gzip.open(file,'r').readlines() 
    #f is a list 
    f[10000] 
    #we can process nth line 

3.f=gzip.open(file,'r') 
    while True: 
     linelist=list(islice(f,4)) 

4.for line in fileinput.input(): 
    process line 

2와 3의 차이점은 무엇입니까? 나는 그들의 메모리 사용량이 동일하다는 것을 알게된다. islice()는 또한 먼저 전체 파일을 메모리에로드해야합니다 (그러나 나중에 비트 단위로 가져옴). 그리고 네 번째 방법은 메모리 소비가 적다는 것이고, 비트 단위로 처리하는 것입니다. 10GB 크기의 파일 인 경우 어떤 파일 읽기 방법을 권하고 싶습니까? 모든 생각/정보를 환영합니다. thx

편집 : 내 문제 중 하나는 때때로 특정 줄을 임의로 선택해야한다고 생각합니다. 말 :

f1=open(inputfile1, 'r') 
while True: 
    line_group1 = list(islice(f1, 3)) 
    if not line_group1: 
     break 
    #then process specific lines say, the second line. 
    processed 2nd line 
    if (....): 
      LIST1.append(line_group1[0]) 
      LIST1.append(processed 2nd line) 
      LIST1.append(line_group1[2]) 

그리고 나서 sth. like

with open(file,'r') as f, 
    for line in f: 
     # process line 

가 올바르게 작동하지 않을 수 있습니까?

+0

큰 텍스트 파일에 임의의 라인 액세스 권한이 필요합니까? –

+0

글쎄, 사실 반드시 그렇지는 않아. 기본적으로 한 줄씩 처리하십시오. 또는 N 라인을 그룹으로 포함 할 수 있습니다. – user815408

답변

4

당신은 잊었 -

with open(...) as f: 
    for line in f: 
     <do something with line> 

with 문 핸들을 내부 블록에서 예외가 발생하는 경우를 포함하여 파일 열기 및 닫기. for line in f은 파일 객체 f을 반복 가능한 것으로 취급합니다.이 객체는 자동으로 버퍼링 된 IO 및 메모리 관리를 사용하므로 대용량 파일에 대해 걱정할 필요가 없습니다.

처리가 시작되기 전에 &이 전체 파일 내용을 메모리에로드하기 때문에 대용량 파일의 경우 두 가지 모두 권장되지 않습니다. 큰 파일을 읽으려면 한 번에 전체 파일을 읽지 않는 방법을 찾아야합니다.

하나가되어야하며, 가능한 한 분명한 방법이 있어야합니다.

+0

ZEN 인용문 편집 후 두 번째로 +1 할 수 없습니다. 도덕적으로 완료되었습니다! ;) – mac

+0

thx,하지만 내 편집을 볼 수 있습니까? 때로는 특정 라인 (예 : 10000 라인)을 가져와야합니다. 그럼 내가 어떻게 할 수 있니? – user815408

+0

간단히 말하면, 기본적으로 줄 번호 인'counter '를 유지하십시오. 자사의 10000 번째 줄을 확인하고 특별한 처리를하십시오. –

1

당신은 당신이 뭔가를 반복으로 인덱스를 얻을 수 enumerate를 사용할 수 있습니다

for idx, line in enumerate(f): 
    # process line 

간단하고 메모리를 효율적입니다. 당신은 실제로 너무 islice를 사용하고, 반복 첫번째 목록으로 변환하지 않고 할 수

for line in islice(f,start,stop): 
    # process line 

어느 접근 방식을 메모리에 전체 파일을 읽을 수 없으며, 중간 목록을 만들 수 있습니다.

fileinput은 표준 입력 또는 파일 목록을 신속하게 반복하기위한 단순한 도우미 클래스이므로이를 사용하면 메모리 효율성 이점이 없습니다.

Srikar가 지적했듯이 with 문을 사용하면 파일을 열고 닫는 것이 좋습니다.

+0

with islice (f, 4), 목록을 만들지 않으면 어떻게 선택할 수 있습니까? 첫 번째, 두 번째, 세 번째 및 네 번째 줄을 밖으로? (내가 게시물에서하는 것처럼) – user815408

+0

islice (f, 4)의 줄 : for print lines은 1,2,3,4 행을 인쇄합니다. 2 ~ 5 행을 원하면'islice (2,6)'을 대신 사용할 수 있습니다. – zeekay

0

당신이 얼마나 많은 줄을 모르고 그 안에 얼마나 많은 \ n을 쓸지 모를 때까지. 1에서 열거 형을 추가하여 줄 번호를 가져올 수 있습니다.

0

큰 파일의 특정 줄을 읽으려면 linecache library을 사용할 수 있습니다.

관련 문제