簡體   English   中英

當另一個函數可以解析csv文件時,為什么該函數無法解析csv文件中的數據

[英]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另一個函數無法從中獲取更多行。

您在這里有兩個明顯的解決方案:

  1. 每次用盡reader時,通過data_out.seek(0)倒帶data_out 您的代碼已完成此操作:

     data_out.seek(0) reader = csv.reader(data_out) next(reader,None) 

    現在,由於您將reader用作全局資源,因此此刻僅執行一次。 您必須在generalNumberparticipated了的末尾重復data_out.seek(0) 即使這樣,由於文件和迭代器是分開的,這可能仍然無法正常工作,但是希望您能理解。

  2. 每次您要閱讀時都打開該文件。 理想情況下,您的兩個函數都只取一個文件名,打開該文件,對其進行迭代,然后再次關閉它。 這樣,您每次都會得到一個新的,新鮮的迭代器。

     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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM