24

Python の CSV ライブラリまたは同様の手法を使用して CSV ファイルをインラインで変更できますか?

現在、ファイルを処理し、最初の列 (名前フィールド) を更新してフォーマットを変更しています。私のコードの簡略版は次のようになります。

with open('tmpEmployeeDatabase-out.csv', 'w') as csvOutput:
    writer = csv.writer(csvOutput, delimiter=',', quotechar='"')

    with open('tmpEmployeeDatabase.csv', 'r') as csvFile:
        reader = csv.reader(csvFile, delimiter=',', quotechar='"')

        for row in reader:
            row[0] = row[0].title()
            writer.writerow(row)

哲学は機能しますが、ファイルを複製しないようにインライン編集を行うことができるかどうか興味があります。

私は次のことを試しましたが、これは新しいレコードを置き換えるのではなく、ファイルの最後に追加します。

with open('tmpEmployeeDatabase.csv', 'r+') as csvFile:
    reader = csv.reader(csvFile, delimiter=',', quotechar='"')
    writer = csv.writer(csvFile, delimiter=',', quotechar='"')

    for row in reader:
        row[1] = row[1].title()
        writer.writerow(row)
4

2 に答える 2

62

いいえ、現在読み取り中のファイルに書き込みを試みるべきではありません。行を読み取った後に ing backを保持する場合はこれを行うことができseekますが、特に読み取ったよりも多くのデータを書き戻す場合はお勧めできません。

標準的な方法は、新しい一時ファイルに書き込み、それを読み取り元の古いファイルの上に移動することです。

from tempfile import NamedTemporaryFile
import shutil
import csv

filename = 'tmpEmployeeDatabase.csv'
tempfile = NamedTemporaryFile('w+t', newline='', delete=False)

with open(filename, 'r', newline='') as csvFile, tempfile:
    reader = csv.reader(csvFile, delimiter=',', quotechar='"')
    writer = csv.writer(tempfile, delimiter=',', quotechar='"')

    for row in reader:
        row[1] = row[1].title()
        writer.writerow(row)

shutil.move(tempfile.name, filename)

tempfileここではとライブラリを利用shutilして、タスクを簡単にしました。

于 2013-04-15T17:12:12.727 に答える