【问题标题】:CSV writer adds the first line to the last cellCSV 编写器将第一行添加到最后一个单元格
【发布时间】:2020-11-19 22:51:57
【问题描述】:

我正在尝试写入已使用另一个程序(excel 和其他程序)保存的 csv 文件。 但是,当我打开文件进行写入时,写入的第一行将添加到最后一行的最后一个单元格中。

file.csv
['1','2','3']
['1','2','3']
import csv   
fields=['A','B','C']
with open('file.csv', 'a', newline='') as f:
    writer = csv.writer(f)
    writer.writerow(fields)

预期结果:

['1','2','3']
['1','2','3']
['A','B','C'] 

实际结果:

['1','2','3']
['1','2','3A','B','C']

如果我只是写入文件然后再次写入而不查看它,没有问题,但是如果我打开文件并将其保存在程序中,则写入的下一行将添加到上一行而不是成为它自己的行。

我认为程序保存文件的方式存在格式问题,但我不知道如何修复它。

【问题讨论】:

  • 你为什么要使用newline='' 参数?
  • @Serial Lazer 我在试图找出问题所在时添加了它,他们在一些示例中使用了它。没有它,问题仍然存在
  • @SerialLazer - writer documentation 告诉您使用 newline=""。原因是作者会写符合规范的“\r\n”,并且不希望python的换行符也在那里。

标签: python excel csv export-to-csv


【解决方案1】:

CSV 文件中的行应始终以“\r\n”序列终止,即使它是文件中的最后一行。在 CSV 编程的宏大传统中,这一点经常被忽略。修复方法是编写一个程序来查看文件并在使用前根据需要对其进行修复。并针对最初编写不合格 CSV 的“其他”程序编写一个错误。

import csv

def csv_delimiter_fixer(filename):
    with open(filename, 'a+b') as fileobj:
        fileobj.seek(-1, 2)
        if fileobj.read(1) != b"\n":
            fileobj.write(b"\r\n")

fields=['A','B','C']
filename = 'file.csv'
csv_delimiter_fixer(filename)
with open('file.csv', 'a', newline='') as f:
    writer = csv.writer(f)
    writer.writerow(fields)

【讨论】:

  • 使用相同的逻辑我也可以打开文件,将其读入列表,然后在开始添加其他行之前将该列表覆盖旧文件。有效地创建一个新的格式正确的文件?我已经先阅读列表,不要添加重复的行。
  • 我在什么时候使用太多内存只是移动相同的信息?每个实例都写整个文件会不会太过分了?
  • 这是个好问题。这将取决于预期的大小。您需要以任何方式读取文件以避免重复。在一台普通的 PC 上,几十兆的数据并不是那么糟糕。如果数据变得非常大,您可能需要不同的方案。这取决于数据。如果是一堆数字,使用 numpy 或 pandas 以及其他一些文件保存格式可能会更好。也许这是应该放入数据库中以便以后更有效查询的数据类型。要做什么取决于几个因素。
  • 感谢您的帮助!我创建的最大文件有 10MB,以后可能会集成一个数据库。我一直在将 pandas 用于我的其他程序,但是对于我一夜之间运行的一个小型网络爬虫来说,这似乎有点矫枉过正。
  • 您可以添加一些日志记录以查看时间是否太长,但 10 meg 也不错,尤其是当文件被多次读取并且位于操作系统文件缓存中时。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-12-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-24
相关资源
最近更新 更多