我想删除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])
我无法弄清楚为什么我一直收到错误信息。
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)
import csv
f = open('Pnl.csv', "r+")
lines = f.readlines()
lines.pop()
f = open('Pnl.csv', "w+")
f.writelines(lines)
我不确定你在使用'a+r+b'文件模式并读写同一个文件时在做什么,因此不会提供完整的代码片段,但这里有一种简单的方法可以跳过任何包含NUL字节的行,无论是读取的最后一行、第一行还是中间的某一行。
诀窍在于意识到文档说csv.writer()
的csvfile参数“可以是支持迭代器协议并在每次调用其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 字节的行。此外,该技术是实时处理每一行的读取,因此不需要一次性将整个文件读入内存或预处理。
row[:-1]
会给你当前行除了最后一个元素之外的所有元素,但它不会给你除了最后一行以外的所有行。换句话说,这会删除最后一列而不是最后一行。 - octern