从csv文件按列打印数据时的奇怪行为

时间:2014-11-12 22:09:59

标签: python csv file-io append readfile

我试图从我的csv文件中逐列打印数据。

column, column2, column3, column4, column5, column6, column7 = [], [], [], [], [], [], [] 
for each in data:
    column.append(each[0])
    column2.append(each[1])
    column3.append(each[2])
    column4.append(each[3])
    column5.append(each[4])
    column6.append(each[5])
    column7.append(each[6])            
print column
print column2
print column3
print column4
print column5
print column6
print column7

这给出了正确的打印,我可以按列显示数据,但是当我尝试时:

c=[]
for i in xrange(7):
    for each in data:
        c.append(each[i])
    print c
    c = []

正确打印第1列,所有列都空白! 我到底哪里出错?

2 个答案:

答案 0 :(得分:3)

columns = zip(*data)

那就是你需要的一切

for column in zip(*data):
   print column

答案 1 :(得分:2)

您的代码存在的问题是,data是一次性iterator(无论是csv.reader还是您自己编写的内容)。一旦你第一次到达文件末尾的最后一行,for each in data:就会给你最后一行之后的所有行,其中没有。

可以通过关闭文件,重新打开文件并在其周围包装另一个阅读器来解决此问题。或者通过调用文件上的f.seek(0)。或者通过将整个文件读取为可重复迭代的内容,如字符串列表,并迭代它。但实际上,这些都不是很好的解决方案。


更好的想法就是扭转你的循环:

c=[[] for _ in xrange(7)]
for each in data:
    for i in xrange(7):
        c[i].append(each[i])
for col in c:
    print col

现在它等同于原始代码,除非没有重复。


更好的想法就是使用zip来转置数据,就像在Joran Beasley's answer中一样:

for col in zip(*data):
    print col