1

Python で csv に書き込んでいますが、プログラムの実行が完了したときに出力ファイルが空白になるのはなぜだろうと思っていました。まず、私のコードは次のとおりです。

reader = csv.reader(open(location, 'rU'), delimiter = ',', quotechar = '"')
writer = csv.writer(open('temp.csv', 'wb'), delimiter = ',', quotechar = '"')

writer.writerow(["test", "test", "test", "test", "test", "test", "test"])

count = 0
for row in reader:
    if count != 0 and count < len(split):
        writer.writerow([row[0], row[1], row[2], row[3], row[4], row[5], split[count-1]])
    count = count + 1

私はそれについていくつか知っています:

  • プログラムが終了すると、「temp.csv」に書き込まれるのは「test」行だけです。ドキュメントの残りの部分は空です。
  • 実行中にプログラムを強制停止すると、実際にはファイルにテキストが書き込まれます。何らかの理由で消去されます。
  • 私はいくつかの調査を行い、多くの人が csv ファイルを「閉じる」ことで問題が解決することを発見しましたが、明らかな何かが欠けていない限り、それは私にとってはうまくいかないようです!

よろしくお願いします。

編集:ここに私が取り組んでいるいくつかの更新されたコードがあります:

infile = open(location, 'rU')
outfile = open('temp.csv', 'wb')
reader = csv.reader(infile, delimiter = ',', quotechar = '"')
writer = csv.writer(outfile, delimiter = ',', quotechar = '"')
split = email_text.split('NEW MESSAGE BEGINS HERE')

count = 0
for row in reader:
    if count != 0 and count < len(split):
        writer.writerow([row[0], row[1], row[2], row[3], row[4], row[5], split[count-1]])
        outfile.flush()
    count = count + 1

infile.close()
outfile.close()
4

2 に答える 2

5

ファイルを閉じていません。ファイルを読み込んでいるだけならこれでうまくいくかもしれませんが、ファイルを書き込んでいるときにこれを行うのは絶対に良い考えではありません。

コンテキスト マネージャーを使用します。

with open(location, 'rU') as infile, open('temp.csv', 'wb') as outfile:
    reader = csv.reader(infile, delimiter = ',', quotechar = '"')
    writer = csv.writer(outfile, delimiter = ',', quotechar = '"')
    ...

withこれにより、ブロックが終了したときにファイルが閉じられることが保証されます(例外が原因であっても)。

于 2012-07-12T14:51:01.727 に答える
1

最初の 2 行を変更して、開いているファイル ハンドルを保存し、その後に終了呼び出しを含めます。

reader_file = open(location, 'rU')
writer_file = open('temp.csv', 'wb')
reader = csv.reader(reader_file, delimiter = ',', quotechar = '"')
writer = csv.writer(writer_file, delimiter = ',', quotechar = '"')

# ... rest of code ...

reader_file.close()
writer_file.close()
于 2012-07-12T15:08:56.643 に答える