Python:多个函数调用追加到同一个列表

时间:2014-08-06 01:23:38

标签: python list csv

我来自Javascript背景,我知道这可以在Javascript中运行,但这与Python有什么根本的区别?

我正在阅读CSV(下面的示例)并将列的所有值(基于索引参数)添加到get_min_max函数中的列表中,对列表进行排序,然后返回第一个列表中的最后一个值,分别为min和max。

get_min_max的第一次调用效果很好,但第二次调用失败。会发生的是第二个函数调用的值被附加到第一个列表。

如何阻止第二个函数调用附加到与第一个函数调用相同的列表?显然,我在这里遗漏了一些关于Python的基本知识。

样本CSV

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.在第二次调用时返回列表返回空列表;在第一次调用时返回列表将返回第一次调用和第二次调用的值列表。

感谢。

4 个答案:

答案 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