4

csv の最後の行を削除しようとしていますが、エラーが発生します。_csv.Error: string with NUL byte

これは私がこれまでに持っているものです:

dcsv = open('PnL.csv' , 'a+r+b')
cWriter = csv.writer(dcsv, delimiter=' ')
cReader = csv.reader(dcsv)
for row in cReader:
    cWriter.writerow(row[:-1])

エラーが発生し続ける理由がわかりません

4

3 に答える 3

7

readlines() を使用してファイル全体を読み取り、最後の行をポップアウトしてから、csv モジュールでそれを書き込みます。

import csv
f = open("summary.csv", "r+w")
lines=f.readlines()
lines=lines[:-1]

cWriter = csv.writer(f, delimiter=',')
for line in lines:
    cWriter.writerow(line)
于 2012-06-08T19:27:50.463 に答える
0

「a+r+b」ファイル モードで何をしていて、同じファイルの読み取りと書き込みを行っているのかわからないため、完全なコード スニペットは提供しませんが、次の行をスキップする簡単な方法を次に示します。読み取っているファイルが最後、最初、または途中にあるかどうかに関係なく、読み取り中のファイルに NUL バイトが含まれています。

トリックは、ドキュメントがcsvfile引数を「イテレータプロトコルをサポートし、メソッドが呼び出されるたびに文字列を返すcsv.writer()任意のオブジェクトにすることができる」と言っていることを認識することです。これは、呼び出しのファイル引数を、次のように定義された単純なフィルター反復子関数に置き換えることができることを意味します。next()

def filter_nul_byte_lines(a_file):
    for line in a_file:
        if '\x00' not in line:
            yield line

これを次のように使用します。

dcsv = open('Pnl.csv', 'rb+')
cReader = csv.reader(filter_nul_byte_lines(dcsv))
for row in cReader:
    print row

これにより、ファイルの読み取り中に NUL バイトを含むすべての行が無視されます。また、この手法は各行が読み取られるときにオンザフライで機能するため、ファイル全体を一度にメモリに読み取ったり、事前に前処理したりする必要はありません。

于 2012-06-08T22:35:15.923 に答える