从CSV文件中删除最后一行

5

我想删除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])

我无法弄清楚为什么我一直收到错误信息。


也许你的文件中有一个NUL字节? - Thomas
1
我不认为这样做能够得到你想要的结果。row[:-1] 会给你当前行除了最后一个元素之外的所有元素,但它不会给你除了最后一行以外的所有行。换句话说,这会删除最后一列而不是最后一行。 - octern
另外,脚本中哪一行出现了错误? - octern
3
在Windows+Python 2.7上,'a+r+b'是一种无效的模式。 - Dhara
请记住:接受一个答案是非常好的做法,几乎是必须的。显然,您没有接受任何问题的答案。 - brandizzi
3个回答

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

如果在最后一个CSV行中有一个带有换行符的引用字段,那么这可能会出现问题,因此逻辑行跨越多行。 - huon

2
这应该可以工作。
import csv
f = open('Pnl.csv', "r+")
lines = f.readlines()
lines.pop()
f = open('Pnl.csv', "w+")
f.writelines(lines)

0

我不确定你在使用'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 字节的行。此外,该技术是实时处理每一行的读取,因此不需要一次性将整个文件读入内存或预处理。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接