Python脚本无法正确循环

时间:2014-10-15 14:21:29

标签: python loops csv for-loop

我正在使用这个python代码来查看csv,它在一列中有日期,在另一列中有值。我正在记录每年的最低价值。我的代码没有正确循环。我的愚蠢错误是什么?干杯

import csv
refMin = 40

with open('data.csv') as csvfile:
        reader = csv.reader(csvfile, delimiter=',',quotechar='|', quoting=csv.QUOTE_ALL)
        for i in range(1968,2014):
            for row in reader:
                if str(row[0])[:4] == str(i):
                    if float(row[1]) <= refMin:
                        refMin = float(row[1])
            print 'The minimum value for ' + str(i) + ' is: ' + str(refMin)

2 个答案:

答案 0 :(得分:4)

读者只能迭代一次。第一次围绕for i in range(1968,2014)循环,您将使用阅读器中的每个项目。所以第二次绕过那个循环,没有剩下的东西了。

如果你想将i的每个值与文件中的每一行进行比较,你可以交换你的循环,这样循环for row in reader在外面,只运行一次,有多个而是运行i循环。或者你可以每次创建一个新的阅读器,虽然这可能会更慢。

如果要一次处理整个文件,则需要创建值字典来替换refMin。处理每一行时,要么遍历字典键,要么根据当前行查找它。另一方面,如果您乐意多次阅读该文件,只需在外部循环内移动reader = csv.reader(...)行。

这是一次未经考验的想法:

import csv
import collections
refMin = collections.defaultdict(lambda:40)

with open('data.csv') as csvfile:
    reader = csv.reader(csvfile, delimiter=',',quotechar='|', quoting=csv.QUOTE_ALL)
    allowed_years = set(str(i) for i in range(1968,2014))
    for row in reader:
        year = int(str(row[0])[:4])
        if float(row[1]) <= refMin[year]:
            refMin[year] = float(row[1])

for year in range(1968, 2014):
    print 'The minimum value for ' + str(year) + ' is: ' + str(refMin[year])

defaultdict就像普通字典一样,只是它有一个以前没有设置的密钥的默认值。

答案 1 :(得分:0)

我会重构一次只读一次文件:

import csv
refByYear = DefaultDict(list)

with open('data.csv') as csvfile:
    reader = csv.reader(csvfile, delimiter=',',quotechar='|', quoting=csv.QUOTE_ALL)
    for row in reader:
        refByYear[str(row[0])[:4]].append(float(row[1]))
for year in range(1968, 2014):
    print 'The minimum value for ' + str(year) + ' is: ' + str(min(refByYear[str(year)]))

这里我存储了每年的所有值,这些值可能对其他用途有用,或者完全没用。