Python函数只运行一次

时间:2016-05-17 17:01:34

标签: python python-3.x

我正在预处理csv文件,并希望输出由字段过滤的csv文件数据组成的3个字典。

设置为:

import csv
from m_functions import region_goals    

csvFile = # a file path

mnDict = dict()
nlDict = dict()
neDict = dict()

# READ CSV
weekList = csv.reader(open(csvFile))

# CREATE DICTIONARY FOR THIS WEEK AND REGION
region_goals(weekList, "STR1", neDict)
region_goals(weekList, "STR2", mnDict)
region_goals(weekList, "STR3", nlDict)

region_goals函数是:

def region_goals(csv, region, region_dictionary):
    firstline = True
    for row in csv:
        if firstline:
            firstline = False
            continue
        if row[14] == region:
            if row[16] not in region_dictionary:
                region_dictionary[row[16]] = float(row[6])
            else:
                region_dictionary[row[16]] += float(row[6])
        else:
            continue
    return region_dictionary

首次使用该功能时,输出始终如预期。第二次我使用该函数,返回空字典。

我确信这是我错过了一些小东西,但我是python的新手并且一直在努力解决这个问题。提前感谢您的回复。

4 个答案:

答案 0 :(得分:2)

第一次通过后,您就在CSV文件的末尾,没有什么可以阅读,所以您需要重新打开它。

此外,使用函数就地修改对象并不是最好的选择。最好每次都返回一个新对象。

import csv
from m_functions import region_goals    

csvFile = # a file path

regions = ['STR1', 'STR2', 'STR3']
for region in regions:
    with csv.reader(open(csvFile)) as weekList:
        region_dict = dict()
        output = region_goals(weekList, region, region_dict )

答案 1 :(得分:1)

您已经在第一次函数调用后读取了该文件,您可以在打开的文件上执行'see(0)'。尝试这样的事情:

# READ CSV
f = open(csvFile)
weekList = csv.reader(f)

region_goals(weekList, "STR1", neDict)
f.seek(0)
region_goals(weekList, "STR2", mnDict)

编辑: 如果文件不是太大和/或你处理更多内存使用,你可以做类似的事情:

# READ CSV
weekList = list(csv.reader(open(csvFile)))

您的代码应该可以工作,但请记住,整个文件将被加载到内存中。

最好的解决方案是重构事物以在一次传递中填充这三个dicts并调用该函数一次。

答案 2 :(得分:1)

您的标题在某种意义上是错误的,该功能显然是多次执行的。否则你不会得到空的dicts。空句子的原因是,csv.reader已经返回一个行为类似于迭代器的对象。所以你只能迭代一次。接下来的两个调用将不再获取任何数据。您必须再次调用csv.reader,或者必须将数据读入内存并处理三次。

答案 3 :(得分:0)

根据g.d.d.c的建议,我修改了函数以包含阅读器并传递文件位置而不是读入的csv。

import csv


def region_goals(csvfile, region, region_dictionary):
    weeklist = csv.reader(open(csvfile))
    firstline = True
    for row in weeklist:
        if firstline:
            firstline = False
            continue
        if row[14] == region:
            if row[16] not in region_dictionary:
                region_dictionary[row[16]] = float(row[6])
            else:
                region_dictionary[row[16]] += float(row[6])
        else:
            continue
    return region_dictionary

感谢您的回复!