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 回答
1

这应该工作

import csv
f = open('Pnl.csv', "r+")
lines = f.readlines()
lines.pop()
f = open('Pnl.csv', "w+")
f.writelines(lines)
于 2019-11-21T01:34:44.140 回答
0

我不确定您在使用“a+r+b”文件模式以及读取和写入同一个文件时做了什么,因此不会提供完整的代码片段,但这里有一个简单的方法可以跳过任何行在您正在阅读的文件中包含一个 NUL 字节,无论它是最后一个、第一个还是正在读取的中间文件。

诀窍是要意识到文档说csv.writer()“可以是任何支持迭代器协议并在每次next()调用其方法时返回一个字符串的对象”的 csvfile 参数。这意味着您可以使用以这种方式定义的简单过滤器迭代器函数替换调用中的文件参数:

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 回答