我正在使用这个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)
答案 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)]))
这里我存储了每年的所有值,这些值可能对其他用途有用,或者完全没用。