Python CSV 插入最后一个换行符 - 我该如何避免它



假设我创建了一个包含两行的csv:

>>> import csv
>>> csvfile = csv.writer(open('test.csv', 'w'))
>>> csvfile.writerow(['row'])
5
>>> csvfile.writerow(['row2'])
6

阅读时,我得到最后一行新行:

>>> open('test.csv').read()
'rownrow2n'

当然,这是可以预料的,但就我而言,我宁愿不要使用它,因为它更容易解释:进行拆分时无需检查空行。

>>> open('test.csv').read().split('n')
['row', 'row2', '']

作为一种解决方法,您可以使用StringIO()对象进行写入。然后,可以在写入文件之前rstrip()将输出应用于它:

from io import StringIO        
import csv
output = StringIO(newline='')
csvfile = csv.writer(output)
csvfile.writerow(['row'])
csvfile.writerow(['row2'])        
with open('test.csv', 'w', newline='') as f_output:
    f_output.write(output.getvalue().rstrip())

这样做的好处是保留了 CSV 库的全部功能。不过,我建议您保留尾随换行符。


对于迭代方法:

from io import StringIO        
import csv
data = [['row'], ['row2']]
with open('test.csv', 'w', newline='') as f_output:
    iter_data = iter(data)
    next_row = next(iter_data)
    csv_writer = csv.writer(f_output)
    for row in iter_data:
        csv_writer.writerow(next_row)
        next_row = row
    # Write the last row to a string to remove trailing newline
    last_row = StringIO(newline='')
    csv.writer(last_row).writerow(next_row)
    f_output.write(last_row.getvalue().rstrip())        

这将一次写入一行数据,然后使用 StringIO() 方法处理最后一行以删除尾随换行符。

经过一番调查,我找到了写行来源:https://hg.python.org/cpython/file/tip/Modules/_csv.c#l1254

而且,据我猜到,那里没有这样的选择

这样做:

open('test.csv').read().strip('n').split('n')

最新更新