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

我对这个功能的问题是“转换器”。它从无开始。然后稍后 'func = converters[j]' j 我知道是一个刚刚通过枚举创建的数字。因此它正在寻找由 j 索引的相应转换器项。但是转换器中什么都没有,因为它是 None 对吗?除非python程序不必从上到下阅读?在这种情况下,我们从接下来的两行“if len(item.st....etc)”或“else:”部分获取 func。但是,我只是假设它必须从上到下阅读。

我不知道其他任何事情是否重要,所以我只包含了整个功能。convertd 是一个字典映射,我相信用户可以提供作为参数来自动查找转换器。checkrows 只是用户在开始时作为参数提供的一个数字,用于检查有效性。默认为无。我还是一个初学者,所以仅供参考。=)

谢谢大家。这个网站太有帮助了!

4

3 回答 3

2

转换器在循环开始时再次设置

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

所以在那之后它不再是 None 了。

于 2009-09-23T18:51:02.487 回答
1

除非我遗漏了什么,否则在第一次迭代中“i”为 0,因此执行以下操作:

converters = [mybool]*len(row)

并初始化“转换器”

于 2009-09-23T18:48:55.353 回答
1

第一的,

converters = None

为 设置初始值converters。这样,如果迭代没有发生(因为readers可能为空),那么当函数返回时converters,它将存在并具有 value None

如果迭代结束readers,则converters在第一次通过迭代时立即将其重置为更有意义的值(当i==0):

converters = [mybool]*len(row)
于 2009-09-23T19:34:18.483 回答