我试图删除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])
我无法弄清楚为什么我会一直收到错误
答案 0 :(得分:6)
我只是用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)
答案 1 :(得分:1)
这应该有效
import csv
f = open('Pnl.csv', "r+")
lines = f.readlines()
lines.pop()
f = open('Pnl.csv', "w+")
f.writelines(lines)
答案 2 :(得分:0)
我不确定您在使用'a + r + b'文件模式以及读取和写入同一文件时所做的是什么,因此不会提供完整的代码段,但这里有一个简单的方法可以跳过在您正在阅读的文件中包含NUL字节的任何行,无论是最后一个,第一个还是正在读取的中间一个。
诀窍是要意识到文档说csv.writer()
“的csvfile参数可以是任何支持 iterator 协议的对象,并且每次都会返回一个字符串{{1}调用方法。“这意味着您可以使用以这种方式定义的简单过滤器迭代器函数替换调用中的file参数:
next()
并以类似于此的方式使用它:
def filter_nul_byte_lines(a_file):
for line in a_file:
if '\x00' not in line:
yield line
这将导致在读取文件时忽略其中包含NUL字节的所有行。此技术也可以在读取每一行时即时工作,因此不需要立即将整个文件读入内存或提前预处理。