【问题标题】:Python won't write all data to csv file from several listsPython不会将多个列表中的所有数据写入csv文件
【发布时间】:2017-04-02 18:04:56
【问题描述】:

我正在抓取一个 XML 文件并将数据存储到几个列表中。最终,我从列表中获取数据并将其写入 CSV 文件。代码运行没有任何错误,但是当我之后检查数据时,似乎最后列表中的项目没有写入文件。最终文件中应该有大约 2000 行。

这是我的代码:

with codecs.open("some_file.csv", 'w', encoding='utf-8') as file:
    writer = csv.writer(file, lineterminator='\n', delimiter=";")

    for a, b, c in zip(l1, l2, l3):
        writer.writerow([a, b, c])

我犯规了this 主题,但我已经使用了with。我错过了什么?

【问题讨论】:

  • 你为什么要自己压缩一个列表? a b 和 c 都是一样的。
  • 假设这意味着zip(l1, l2, l3),您能确认l1l2l3 的长度都相同吗?如果它们的长度不同,您可能需要itertools.zip_longest()
  • 您是否以任何方式终止您的程序?尝试在 writerow 之前使用 print 打印值。看看问题出在循环还是writer
  • 所有列表的长度相同。当我不使用zip 时,我收到一条错误消息too many values to unpack。调试显示来自 xml 的所有数据都正确存储在列表中,并且没有任何遗漏。当我在写入文件之前打印出值时,结果与 csv 中的相同。最后的一些值丢失了。所以问题可能出在循环上。
  • 试试writer.writerows(zip(l1, l1, l1))

标签: python csv


【解决方案1】:

我想你可能想看看你的三个列表,以及zip

如果列表的长度不同,则 zip 会将有问题的列表丢弃。

#!/usr/bin/env python

import csv
import codecs

L1 = ["foo", "bar", "bat", "baz"] # <-- this guy has one more! expect to be truncated
L2 = ["hoo", "hah", "hee"] # <--note, one field less!
L3 = range(2) #<--note, only two fields long! expect entire line to be dropped!

with codecs.open("test.csv", "w", encoding="utf-8") as f:
    writer = csv.writer(f, lineterminator="\n", delimiter=";")
    for row in zip(L1, L2, L3):
        writer.writerow(row)

由于您在 L3 中只有两个值,其余的有三个,因此 zip 会截断您的错误输出。

~$ cat test.csv
foo;hoo;0
bar;hah;1

您当然会注意到,我使用 zip 为三个列表中的每个索引输出一个列表值。这与您的示例不同。我不确切知道你在那里做什么,但如果这些“l”值中的每一个都代表一个列表,那么就没有真正需要显式创建这些值,然后将它们添加到列表中。

再次,很高兴看到您的输入示例(如果可能)。在构建这些列表以使它们“匹配”时,可能必须插入 None 值(或空字符串或其他)。

L1 = ["foo", "bar", "bat", "baz"]
L2 = ["hoo", "hah", "hee", None]
L3 = range(2) + [None, None]

这可能会给你你想要的:

~$ cat test.csv
foo;hoo;0
bar;hah;1
bat;hee;
baz;;

【讨论】:

    【解决方案2】:

    代码看起来不错;

    $ cat test.py
    import codecs
    import csv
    
    l1 = ['hest', 'hat', 'test', 'more test']
    l2 = ['hest2', 'hat', 'test', 'even more test']
    l3 = ['hest3', 'hat', 'test', 'even even more test']
    
    with codecs.open("some_file.csv", 'w', encoding='utf-8') as file:
        writer = csv.writer(file, lineterminator='\n', delimiter=";")
    
        for a, b, c in zip(l1, l2, l3):
        writer.writerow([a, b, c])
    
    $ python test.py
    $ cat some_file.csv 
    hest;hest2;hest3
    hat;hat;hat
    test;test;test
    more test;even more test;even even more test
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-02-05
      • 2023-03-15
      • 1970-01-01
      • 2018-04-02
      • 2021-10-18
      • 2012-12-11
      • 1970-01-01
      相关资源
      最近更新 更多