我正在预处理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的新手并且一直在努力解决这个问题。提前感谢您的回复。
答案 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
感谢您的回复!