我来自Javascript背景,我知道这可以在Javascript中运行,但这与Python有什么根本的区别?
我正在阅读CSV(下面的示例)并将列的所有值(基于索引参数)添加到get_min_max
函数中的列表中,对列表进行排序,然后返回第一个列表中的最后一个值,分别为min和max。
get_min_max
的第一次调用效果很好,但第二次调用失败。会发生的是第二个函数调用的值被附加到第一个列表。
如何阻止第二个函数调用附加到与第一个函数调用相同的列表?显然,我在这里遗漏了一些关于Python的基本知识。
0,11,23
1,34,67
2,86,99
3,45,21
4,60,98
5,2,123
6,7,12
7,9,0
import csv
f = open("test.csv", "r")
reader = csv.reader(f, delimiter=",")
def get_min_max(reader, index):
arr=[]
for row in reader:
arr.append(row[index])
arr.sort()
return {
"min": arr[0],
"max": arr[-1]
}
get_min_max(reader, 1) # call no. 1
get_min_max(reader, 2) # call no. 2
列出索引超出范围的索引号码。 2.在第二次调用时返回列表返回空列表;在第一次调用时返回列表将返回第一次调用和第二次调用的值列表。
感谢。
答案 0 :(得分:1)
在第二次调用中,来自reader
的数据已被消耗,因此不返回任何内容。
这说明了问题:
>>> f = open("test.csv", "r")
>>> import csv
>>> reader = csv.reader(f, delimiter=",")
>>> list(reader)
[['0', '11', '23'], ['1', '34', '67'], ['2', '86', '99'], ['3', '45', '21'], ['4', '60', '98'], ['5', '2', '123'], ['6', '7', '12'], ['7', '9', '0']]
>>> list(reader)
[]
可能的解决方案:您可以将文件数据缓存在某些变量中,也可以在函数get_min_max
答案 1 :(得分:1)
有两个错误:一个是安东尼提到的(读者已经消耗了文件)而另一个错误 - 你将数字排序为"字符串"这意味着" 11" < " 2"
修复它:
import csv
def get_min_max(filename, index):
f = open(filename, "r")
reader = csv.reader(f, delimiter=",")
arr=[]
for row in reader:
arr.append(int(row[index])) # <-- second fix
arr.sort()
return {
"min": arr[0],
"max": arr[-1]
}
print get_min_max("test.csv", 1) # prints {'max': 86, 'min': 2}
print get_min_max("test.csv", 2) # prints {'max': 123, 'min': 0}
答案 2 :(得分:0)
因为你已经读完了这个文件。文件对象只能进行一次。你必须使用file.seek(0)
寻找文件的开头或缓存数据。此外,您应该将这些字符串转换为整数,因为它会导致奇怪的事情,如11&lt; 9。
答案 3 :(得分:0)
上述答案解释了程序失败的原因 如果文件大小很小(小于10M),我建议您首先将文件内容读入memeory,然后执行任何操作。
import csv
with open("test.csv", "r") as f:
rows = [row for row in csv.reader(f, delimiter=",")]
def get_min_max(rows, index):
arr=[]
for row in rows:
arr.append(row[index])
arr.sort()
return {
"min": arr[0],
"max": arr[-1]
}
print get_min_max(rows, 1) # call no. 1
print get_min_max(rows, 2) # call no. 2
或使用生成器来解耦文件阅读器,如下所示:
import csv
def csv_gen(fileName):
with open(fileName, "r") as f:
for row in csv.reader(f, delimiter=","):
yield row
def get_min_max(rows, index):
arr=[]
for row in rows:
arr.append(row[index])
arr.sort()
return {
"min": arr[0],
"max": arr[-1]
}
print get_min_max(csv_gen("test.csv"), 1) # call no. 1
print get_min_max(csv_gen("test.csv"), 2) # call no. 2