Python 删除csv中的最后一行

Python 删除csv中的最后一行,python,csv,Python,Csv,我正试图删除csv中的最后一行,但收到一个错误:\u csv.error:带有NUL字节的字符串 这就是我到目前为止所做的: dcsv = open('PnL.csv' , 'a+r+b') cWriter = csv.writer(dcsv, delimiter=' ') cReader = csv.reader(dcsv) for row in cReader: cWriter.writerow(row[:-1]) 我不明白为什么会不断出现错误我会用readlines()读取整个文

我正试图删除csv中的最后一行,但收到一个错误:
\u csv.error:带有NUL字节的字符串

这就是我到目前为止所做的:

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

我不明白为什么会不断出现错误

我会用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)

我不知道你用“A+R+B”文件模式做什么,读和写到同一个文件,所以不会提供完整的代码片段,但是这里有一个简单的方法,跳过在你读的文件中包含一个NUL字节的任何行,无论是最后一个,还是中间一个都被读取。p> 诀窍是要认识到,文档说

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

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字节的行。而且,这种技术在读取每一行的过程中都是动态工作的,因此它不需要立即将整个文件读入内存,也不需要提前对其进行预处理。

这应该是可行的

import csv
f = open('Pnl.csv', "r+")
lines = f.readlines()
lines.pop()
f = open('Pnl.csv', "w+")
f.writelines(lines)

也许你的文件中有一个NUL字节?我不认为这会满足你的要求<代码>行[:-1]将为您提供不带最后一个元素的当前行。它不会给出除最后一行之外的所有行。换句话说,这将删除最后一列,而不是最后一行。另外,脚本中哪一行给出了错误?至少在windows+Python 2.7上,“a+r+b”是无效的ModerMember:这是一个非常好的实践,几乎是必须的!显然,您没有接受任何问题的任何答案。如果在最后一行CSV中有带换行符的带引号的字段,则可能会中断,从而使逻辑行扩展到多行。