0

CSV ファイルをタブ区切りファイルに変換するためのコードがいくつかあります。私の問題は、正しい値を正しい順序で書き込む方法がわからないことです。これが私のコードです:

for file in import_dir:
    data = csv.reader(open(file))
    fields = data.next()
    new_file = export_dir+os.path.basename(file)
    tab_file = open(export_dir+os.path.basename(file), 'a+')
    for row in data:
        items = zip(fields, row)
        item = {}
        for (name, value) in items:
            item[name] = value.strip()
    tab_file.write(item['name']+'\t'+item['order_num']...)
    tab_file.write('\n'+item['amt_due']+'\t'+item['due_date']...)

現在、両方のwriteステートメントがfor row in dataループ内にあるため、ヘッダーが何度も書き込まれています。

最初のwriteステートメントをアウトデントすると、明らかなフォーマット エラーが発生します。
2 番目のステートメントを最初のステートメントの上に移動してwriteアウトデントすると、データの順序が乱れます。最初のステートメントがヘッダーとして 1 回書き込まれ、2 番目のステートメントが CSV ファイルの各行に書き込まれる

ようにするにはどうすればよいですか? write辞書を壊さずに、ループの外側で最初の 'write' ステートメントを抽出するにはどうすればよいですか? ありがとう!

4

3 に答える 3

5

ヘッダーをメイン ループの外側に書き込むコードを抽出し、最初に 1 回だけ書き込まれるようにします。

また、CSV モジュールを (読み取りだけでなく) CSV ファイルの書き込みにも使用することを検討してください。車輪を再発明しないでください。

于 2013-05-30T21:09:37.193 に答える
0

わかりましたので、私はそれを理解しましたが、それは最もエレガントなソリューションではありません. 基本的に、最初のループを実行し、ファイルに書き込み、2 回目のループを実行して結果を追加しました。以下の私のコードを参照してください。ここで行ったことを達成するためのより良い方法についての意見があれば幸いです。ありがとう!

for file in import_dir:
    data = csv.reader(open(file))
    fields = data.next()
    new_file = export_dir+os.path.basename(file)
    tab_file = open(export_dir+os.path.basename(file), 'a+')
    for row in data:
        items = zip(fields, row)
        item = {}
        for (name, value) in items:
            item[name] = value.strip()
    tab_file.write(item['name']+'\t'+item['order_num']...)
tab_file.close()

for file in import_dir:
    data = csv.reader(open(file))
    fields = data.next()
    new_file = export_dir+os.path.basename(file)
    tab_file = open(export_dir+os.path.basename(file), 'a+')
    for row in data:
        items = zip(fields, row)
        item = {}
        for (name, value) in items:
            item[name] = value.strip()
        tab_file.write('\n'+item['amt_due']+'\t'+item['due_date']...)
tab_file.close()
于 2013-05-30T23:10:56.553 に答える