2012-01-03 15 views
1

大量のデータをCSV形式に変換するスクリプトを作成しています。 Google AppEngineではmapbackduce APIを使用して実行されます。これは、データの各行がフォーマットされ、コールバック関数で別々に出力されることを意味します。CSV形式の単一行の書式設定

csvモジュールに既に存在するロジックを利用してデータを正しいフォーマットに変換したいのですが、CSVライターがファイルライクなオブジェクトを想定しているため、それぞれにStringIOをインスタンス化する必要がありますオブジェクトに行を書き込み、その都度オブジェクトの内容を返します。

これは愚かなようですが、書き込み部分なしでcsvモジュールの内部CSVフォーマットロジックにアクセスする方法があるかどうかは疑問です。

+0

'tempfile'モジュールは役に立ちますか?あなたは本当にOSで表示されないファイルハンドルを与えることができます – wim

+0

@wimあり​​がとう、しかし本当にありません。 AppEngineのファイルシステムへのアクセスがないという事実ではないにしても、各行に別々のファイルが必要です。 –

+0

mapreduceを見たことがないので、特にコールバック実行環境に関する制約についてはわかりません。あなたのプログラム(コールバックを提供するプログラム)は、mapreduceの呼び出し中に実行されますか?つまりあなたはグローバルな状態を保つことができますか、それとも毎回 'StringIO'のようなものを再インスタンス化する必要がありますか? –

答えて

3

csvモジュールは、Cで書かれた_csvモジュールをラップします。ソースを取得してファイルライクなオブジェクトを必要としないように変更することはできますが、モジュール内を覗き込むと、再コンパイルせずにそれを行う明確な方法。

+0

(ここでApp Engineは再コンパイルされたC拡張をデプロイできないため、非常に関連性が高くなります) – geoffspear

3

1つのオプションは、独自の「ファイルのような」オブジェクトを持つことができます。実は、cvs.writerので、唯一write方法を持っているオブジェクトのために必要です。

class PseudoFile(object): 
    def write(self, string): 
     # Do whatever with your string 

csv.writer(PseudoFile()).writerow(row) 

あなたがそこにカップルのステップをスキップしていますが、多分それはあなたが望むだけです。

関連する問題