2011-12-15 6 views
1

ftp 서버에서 .csv.gz 파일에 액세스하고 .csv 파일에 동일한 서버에 내용을 쓰는 스크립트를 작성하려고했습니다. 이 방법은 파일이 100MB보다 작 으면 오류없이 메모리 오류가 발생하는 한 제대로 작동하는 것 같습니다. 나는 .csv 파일을 추출하여 파일 내용 (튜플 목록)을 한 줄씩 읽고 새로운 파일에 쓰도록하는 방법을 찾지 못했습니다.파이썬 gzip - 압축 해제 .csv.gz 파일 - 메모리 오류

.csv.gz 파일에서 직접 .csv 파일을 추출하는 더 효율적인 방법이 있습니까?

def gz_unzipper(): 

    hostname = "servername" 
    directory = "path" 
    input_file = directory + "filename.csv.gz" 
    output_file = directory + "filename.csv" 
    ftp = FTP(hostname) 
    ftp.login (username, password) 
    ftp.cwd(directory) 

    f = gzip.open(input_file, 'r') 
    gz_content = f.read() 

    lines=csv.reader(StringIO.StringIO(gz_content)) 

    output_file = open(output_file, 'w') 

    for line in lines: 
     line = repr(line)[1:-1] 
     line = line.replace("'","") 
     line = line.replace(" ","") 

     output_file.write(line + "\n") 

    output_file.close 
    f.close() 
+1

당신이 MemoryError의 그것을 명중 곳의 스택 트레이스 (파이썬 출력)를 추가 할 수 있습니다

이 (죄송합니다, 검증되지 않은) 같은 것을 시도? –

+0

@Super Nova 내 대답이 도움이 되었습니까? – aganders3

답변

2

지금 당신은 작은 파일에 대한 괜찮지 만 (분명히) 당신은 많은 양의 데이터가있는 경우 문제가 발생하는, 한 번에 전체 파일을 읽고있다. 파일을 줄 단위로 처리하기 때문에 파일/csv 파일에 내장 된 Python 반복기를 사용할 수 있습니다. 이들은 일반적으로 으로 구현됩니다. 즉, 필요할 때만 데이터를 읽습니다.

with gzip.open(input_file, 'r') as fin, open(output_file,'w') as fout: 
    csv_reader = csv.reader(fin) 
    csv_writer = csv.writer(fout) 
    csv_writer.writerows(csv_reader)