1

ftp サーバーから .csv.gz ファイルにアクセスし、その内容を同じサーバー上の .csv ファイルに書き戻すスクリプトを作成しようとしました。この方法は、ファイルが 100 MB 未満であれば正常に機能するように見えますが、それを超えると失敗し、メモリ エラーが発生します。.csv ファイルを抽出する方法を見つけることができなかったので、ファイルの内容 (タプルのリスト) を 1 行ずつ読み取り、それを新しいファイルに書き込みます。

これを行うためのより効率的な方法、または .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()
4

1 に答える 1

2

現在、ファイル全体を一度に読み込んでいます。これは小さなファイルの場合は問題ありませんが、(明らかに) 大量のデータがある場合は問題が発生します。ファイルを 1 行ずつ処理しているため、組み込みの Python イテレータをファイル/csv ファイルに使用できます。これらは通常、lazyとして実装されます。つまり、必要なときにのみデータを読み込みます。

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

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)
于 2011-12-15T22:10:03.017 に答える