2009-09-23 108 views
0

所以我試圖理解matplotlib.mlab中csv2rec的源文件。它用於獲取csv文件並將數據解析爲某些格式。所以它可能需要一個字符串'234'並將其轉換爲int。或者取一個日期字符串並將其設置爲python日期時間。這是如何工作的?

def get_converters(reader): 

    converters = None 
    for i, row in enumerate(reader): 
     if i==0: 
      converters = [mybool]*len(row) 
     if checkrows and i>checkrows: 
      break 
     #print i, len(names), len(row) 
     #print 'converters', zip(converters, row) 
     for j, (name, item) in enumerate(zip(names, row)): 
      func = converterd.get(j) 
      if func is None: 
       func = converterd.get(name) 
      if func is None: 
       #if not item.strip(): continue 
       func = converters[j] 
       if len(item.strip()): 
        func = get_func(name, item, func) 
      else: 
       # how should we handle custom converters and defaults? 
       func = with_default_value(func, None) 
      converters[j] = func 
    return converters 

這個函數的問題是'轉換器'。它始於None。然後再'func =轉換器[j]'j我知道這是一個通過枚舉創建的數字。所以它正在尋找由j索引的相應轉換器項目。但是在轉換器中沒有任何東西,因爲它是沒有對的?除非python程序不必從頂部到底部讀取?在這種情況下,我們從後面兩行「如果len(item.st ....等)」或從「else:」部分獲得func。但是,我只是假定它必須從上到下閱讀。

我不知道其他的東西是否重要,所以我只包含了整個功能。 converterd是一個字典映射,我相信用戶可以提供一個參數來自動找到一個轉換器。 checkrows只是用戶在開始檢查有效性時作爲參數提供的一個數字。它是默認的無。我仍然是一個初學者,所以只是fyi。 =)

謝謝大家。這個網站非常有幫助!

回答

2

轉換器被在重新設置與循環開始

if i==0: 
    converters = [mybool]*len(row) 

所以之後,它不是無。

1

除非我失去了一些東西,在第一次迭代「i」爲0,因此執行以下操作:

converters = [mybool]*len(row) 

和初始化「轉換器」

1

首先,

converters = None 

設置了converters的初始值。這樣,如果迭代沒有發生(因爲readers可能爲空),那麼當函數返回converters時,它將存在並且具有值None

如果迭代過readers情況,那麼converters將立即通過迭代復位到在第一遍一個更有意義的值(當i==0):

converters = [mybool]*len(row)