2011-12-15 8 views
1

ftpサーバーから.csv.gzファイルにアクセスし、その内容を同じサーバー上の.csvファイルに書き込むスクリプトを作成しようとしました。この方法は、ファイルが100MB未満である限り正常に動作しているようですが、失敗するとメモリエラーが発生します。私はちょうど.csvファイルを抽出する方法を見つけることができませんでしたので、ファイルの内容(タプルのリスト)を1行ずつ読み込み、新しいファイルに書き込みます。Python 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に当たる場所のスタックトレース(Pythonの出力)を追加することができます。

は、この(申し訳ありませんが、テストされていない)のようなものを試してみてください? –

+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) 
関連する問題