[英]Why does the function fail to parse the data from a csv file when another function works to parse the csv file
def participated():
part_counters = {}
for line in reader:
if int(line[6]) > 0:
primary = line[7].strip()
part_counters.setdefault(primary, 0)
part_counters[primary] += 1
return part_counters
data_out.seek(0)
reader = csv.reader(data_out)
next(reader,None)
def generalNumber():
gen_counters = {}
for line in reader:
if int(line[6]) >= 0:
primary = line[7].strip()
gen_counters.setdefault(primary, 0)
gen_counters[primary] += 1
return gen_counters
我有2個函數試圖從相同的csv文件中解析出相同的數據。 我已經將這個data_out.seek(0) reader = csv.reader(data_out) next(reader,None)
投入了工作,每個函數都可以解析它,但是如果變量不在函數之外,它將無法工作。 我正在嘗試使用外部每個函數的return value
,例如:
counter_p = participated()
counter_g = generalNumber()
success_percentage = [counter_p.get(primary)/counter_g.get(primary, 1) for primary in counter_p]
我所擁有的是,如果兩個功能都處於活動狀態: counter_p = {A01:5, A02:1, A03:2}
和counter_g ={}
但是如果我使參與者()處於非活動狀態,則counter_g = {A01: 6, A02: 3, A03: 5}
簡短的回答:不要做全球資源。
長答案: reader
是一個迭代器,它遍歷csv中的行。 也就是說,只要提供了新行,迭代器就會跳到下一行。 這意味着它將在某個時候到達最后一行,並且無法再提供更多行(因為沒有任何行)。
您的任何一個函數第一次使用reader
,csv的全部內容都會被使用。 之后, reader
位於文件的末尾。 因此,調用使用reader
另一個函數無法從中獲取更多行。
您在這里有兩個明顯的解決方案:
每次用盡reader
時,通過data_out.seek(0)
倒帶data_out
。 您的代碼已完成此操作:
data_out.seek(0) reader = csv.reader(data_out) next(reader,None)
現在,由於您將reader
用作全局資源,因此此刻僅執行一次。 您必須在generalNumber
和participated
了的末尾重復data_out.seek(0)
。 即使這樣,由於文件和迭代器是分開的,這可能仍然無法正常工作,但是希望您能理解。
每次您要閱讀時都打開該文件。 理想情況下,您的兩個函數都只取一個文件名,打開該文件,對其進行迭代,然后再次關閉它。 這樣,您每次都會得到一個新的,新鮮的迭代器。
def generalNumber(file_name): with open(file_name) as data_out: # open the file, implicitly at first line reader = csv.reader(data_out) # create new iterator next(reader,None) # replicated from your code gen_counters = {} for line in reader: if int(line[6]) >= 0: primary = line[7].strip() gen_counters.setdefault(primary, 0) gen_counters[primary] += 1 return gen_counters
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.