2009-09-23 109 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)