2016-11-18 53 views
1

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

这里是我的代码:

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。我错过了什么?

+2

你为什么荏苒与自己的列表?一个b和c都会是一回事。 – Carcigenicate

+2

假设这意味着'zip(l1,l2,l3)',你能否确认l1','l2'和'l3'的长度都是相同的?如果它们长度不一样,你可能需要['itertools.zip_longest()'](https://docs.python.org/3.0/library/itertools.html#itertools.zip_longest)。 –

+0

您是否以任何方式终止您的程序?试着在'writerow'之前使用'print'打印出值。看看问题是出现在循环中还是与“编写器”相关 –

回答

0

该代码看起来不错;

$ 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 
0

我想你可能想看看你的三个列表和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;; 
+0

@RistoYlem这是否清除了什么? – lysdexia