Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python脚本循环不正确_Python_Loops_Csv_For Loop - Fatal编程技术网

Python脚本循环不正确

Python脚本循环不正确,python,loops,csv,for-loop,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

我使用此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)
导入csv
refMin=40
将open('data.csv')作为csvfile:
reader=csv.reader(csvfile,分隔符=',',quotechar='|',quoting=csv.QUOTE|ALL)
对于范围内的i(19682014):
对于读取器中的行:
如果str(行[0])[:4]==str(i):

如果float(行[1])读卡器只能迭代一次。第一次在
for i in range(19682014)
循环中,您使用阅读器中的每一项。因此,第二次循环时,没有剩余的项目

如果要将
i
的每一个值与文件中的每一行进行比较,可以交换循环,以便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])
导入csv
导入集合
refMin=collections.defaultdict(lambda:40)
将open('data.csv')作为csvfile:
reader=csv.reader(csvfile,分隔符=',',quotechar='|',quoting=csv.QUOTE|ALL)
允许的年数=设置(范围(19682014)内i的str(i))
对于读取器中的行:
年份=整数(str(第[0]行)[:4])

如果float(行[1])读卡器只能迭代一次。第一次在
for i in range(19682014)
循环中,您使用阅读器中的每一项。因此,第二次循环时,没有剩余的项目

如果要将
i
的每一个值与文件中的每一行进行比较,可以交换循环,以便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])
导入csv
导入集合
refMin=collections.defaultdict(lambda:40)
将open('data.csv')作为csvfile:
reader=csv.reader(csvfile,分隔符=',',quotechar='|',quoting=csv.QUOTE|ALL)
允许的年数=设置(范围(19682014)内i的str(i))
对于读取器中的行:
年份=整数(str(第[0]行)[:4])

如果float(row[1])我会重构它,只读取文件一次:

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

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

我将重构这些值,以便只读取一次文件:

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 row in reader”关联的for循环只在1968年重复,没有其他年份。是的,因为一旦读取器到达末尾,它不会返回到文件的开头有什么迹象表明它没有正确循环?与“读卡器中的for row”相关联的for循环只在1968年重复,没有其他年份。是的,因为一旦读卡器到达末尾,它就不会返回到有意义的文件开头,谢谢。你知道我可以采取什么措施来解决这个问题吗?你可以输入一个if语句来测试年份是否在该范围内。与其尝试检查是否每个可能的年份值都有
str(行[0])[:4]==str(I)
,不如尝试将年份值从CSV转换为
int
,并进行数字比较(比如说,
1968,这很有意义,谢谢。你知道我可以采取什么措施来解决这个问题吗?你可以加入一个if语句来测试年份是否在这个范围内。而不是试图检查
str(行[0])[:4]==str(I)
对于每个可能的年份值,尝试将年份值从CSV转换为
int
,并进行数字比较(如
1968)