数据未在for循环中传递给变量

时间:2019-11-21 22:22:57

标签: python python-3.x for-loop

我有以下代码

with open('data.csv') as csvfile:
    data = csv.reader(csvfile, delimiter=' ')
    print(data)
    row_count = row_count = sum(1 for lines in data)
    print(row_count)
    for row in data:
        print(row)

它打印:

<_csv.reader object at 0x00000295CB6933C8>
505

因此它将data打印为对象,并将row_count打印为505。在for循环中似乎没有打印row。我不确定为什么没有任何内容传递给变量行?

这特别令人沮丧,因为如果我摆脱了row_count,它就会起作用!为什么? enter image description here

3 个答案:

答案 0 :(得分:3)

data = csv.reader(csvfile, delimiter=' ')
print(data)
row_count = row_count = sum(1 for lines in data)

您只读取了整个文件;您已经用尽了所有输入。您剩下的第二个for找不到任何东西。您必须重置阅读器。最明显的方法是关闭文件并重新打开。不太明显……灵活性较差……是使用

将文件指针重置为开头
csvfile.seek(0)

这不适用于所有文件子类型,但适用于CSV。

更好的是,只需在打印时对行进行计数:

使用open('data.csv')作为csvfile:     数据= csv.reader(csvfile,delimiter ='')

row_count = 0
for row in data:
    print(row)
    row_count += 1

print(row_count)

答案 1 :(得分:2)

您已经通过设置的理解量消耗了数据中的行:

with open('data.csv') as csvfile:
    data = csv.reader(csvfile, delimiter=' ')
    print(data)
    row_count = row_count = sum(1 for lines in data) # This consumes all of the rows
    print(row_count)
    for row in data: # no more rows at this point.
        print(row) # doesn't run because there are no more rows left

如果要在打印每一行之前打印计数,则必须将所有行保存在内存中或创建第二个CSV阅读器对象。

答案 2 :(得分:1)

如果您有足够的存储空间,这可能是将数据放入列表并通过列表进行发送以节省所有麻烦的最佳解决方案

with open('your_csv.csv','r') as f_:
   reader=csv.reader(f_)
   new_list=list(reader)
for row in new_list:
   print(row) #or whatever else you want to do afterwards