在获取行数后,循环通过Python中的CSV文件不起作用

时间:2017-11-02 14:52:56

标签: python csv

我有一个python脚本(Flask),使用csv模块加载CSV文件。然后,我需要计算文件中的行数,然后循环遍历每一行,使用模数然后从每第n行拉出数据。我遇到了一个奇怪的问题。如果我对行计数进行硬编码,那么脚本会按预期运行,并且for循环执行并且模数正确地标记每个第n行:

#rowCount = len(list(reader))
rowCount = 10000

但是,如果我尝试动态计算行数,则for循环不再运行。要清除,行计数按预期计算,但不执行以下for循环,并且不返回错误。有没有人知道为什么会这样?

rowCount = len(list(reader))
#rowCount = 10000

任何建议都会感激不尽。感谢。

def geoPartitioningReport(self, file):
    loopCount = 0
    file = open(os.path.join(os.path.dirname(__file__),'../myFile.csv'), 'rU')
    reader = csv.reader(file, delimiter=',')

    #rowCount = len(list(reader2))
    rowCount = 10000

    noOfPartitions = 500
    partitionFrequency = int(rowCount/noOfPartitions)

    print ('-------------rowCount = ' + str(rowCount))
    print ('-------------partitionFrequency = ' + str(partitionFrequency))

    for rowdata in reader:
        print('aaaaaaaaaaa')
        if loopCount > 0 and loopCount != 1:
            if loopCount % partitionFrequency == 1:
                print ('---------------------------')
                print ('loopNo = ' + str(loopCount))
                print('column 0 = ' + str(rowdata[0]))
                print('column 1 = ' + str(rowdata[1]))
        loopCount += 1

1 个答案:

答案 0 :(得分:2)

csv.reader返回生成器。所以你不能再迭代两次 使用row_count = sum(1 for row in reader)代替行数 或者行数很短,您可以使用len(list(reader))来接收行数 这里最重要的是,csv.reader返回生成器。有关发电机的更多信息,请查看here