Python CSV Writer在文件末尾留下空行

4
以下代码会在文本文件末尾留下一个空白行。如何让writerows不终止最后一行?
        with open(fname, 'wb') as myFile:
        # Start the CSV Writer
        wr = csv.writer(myFile, delimiter=',', dialect='excel')
        wr.writerows(rows)

        # Close the file.
        myFile.close()

你应该意识到实际上并没有添加空行。打开文件进行读取,使用 for line in myFile:print(repr(line)),你将看不到任何空行。 - Padraic Cunningham
1
Padraic,你可能在一个Unix系统上。在Unix中没有添加行,在Windows中有。看起来不一致。 - misantroop
4个回答

2

首先,由于您使用了with open as myFile,因此不需要myFile.close(),当您移除缩进时,它会自动完成。

其次,如果您愿意为程序添加另一部分,您可以编写一个简单的代码来删除最后一行。这方面的示例已经由Strawberry制作(稍作修改):

with open(fname) as myFile:
    lines = myFile.readlines()
with open(fname, "w") as myFile:
    myFile.writelines([item for item in lines[:-1]])

请注意 'w' 参数将清除文件,因此我们需要两次打开文件,一次读取,一次写入。
我还相信,您能够使用 myFile.write,它不会添加新行。使用示例如下:
with open(fname, 'wb') as myFile:
    wr = csv.writer(myFile, delimiter=',', dialect='excel')
    lines = []
    for items in rows:
        lines.append(','.join(items))
    wr.write('\n'.join(lines))

然而,这仅适用于您拥有多维数组的情况,并且应该尽量避免使用。


1
csv.writer没有write方法,如果行包含整数等内容,则join会失败。如果您只使用原始代码,则所有示例的输出也将相同。 - Padraic Cunningham

2

我找不到一个适用于 Python 3 并且也适用于我的情况的答案,所以这里是我的解决方案:

def remove_last_line_from_csv(filename):
    with open(filename) as myFile:
        lines = myFile.readlines()
        last_line = lines[len(lines)-1]
        lines[len(lines)-1] = last_line.rstrip()
    with open(filename, 'w') as myFile:    
        myFile.writelines(lines)

2
感谢 wfgeo,其中一种解决方案如下。虽然它需要使用 os 库,但它使生活变得更轻松:
import csv
import os

with open(fileName, 'w', newline='') as f:
  writer = csv.writer(f, delimiter=';', dialect='excel')
  
  for row in rows:
    row = rows[0].values()
    writer.writerow(row)

  f.seek(0, os.SEEK_END)
  f.seek(f.tell()-2, os.SEEK_SET)
  f.truncate()

2
我很感激这是一个旧请求,但我在寻找相同的解决方案时偶然发现了它。我最终在csv文档本身中阅读到答案,并发现csv.writer具有一个lineterminator格式化参数,默认为\r\n,给出了我们都不想要的新行。

作为解决方案,我向代码添加了格式化参数newline='',它效果很好(如下所示)。

    with open(fname, 'wb') as myFile:
        # Start the CSV Writer
        wr = csv.writer(myFile, delimiter=',', dialect='excel', lineterminator='')
        wr.writerows(rows)

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