Python脚本循环不正确

2024-10-03 06:19:07 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用这个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)

Tags: csvcsvfile代码inforif错误记录
2条回答

我会重构它,只读取一次文件:

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)]))

在这里,我存储了每年的所有值,这些值可能对其他用途有用,也可能完全无用。你知道吗

读取器只能迭代一次。第一次在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就像一个普通的字典,只是它有一个以前没有设置的键的默认值。你知道吗

相关问题 更多 >