1

我用来csv.DictReader从 CSV 文件中读取数据。当阅读器被迭代时,它会产生字典,其中的键取自 CSV 标头和每行的值:

with open(filename) as h:
    data = csv.DictReader(h)
    for row in data:
        # row is dict

每一行都是一个带有的字典,每一行都有完全相同的键。如果值是整数并且键(字符串)很长,则键占用的内存空间比值多。

我可以以每行的键指向相同的键实例的方式迭代行,从而节省每行的内存空间吗?

请注意,我事先不知道密钥 - 它们取自 CSV 标头。否则我可以使用namedtuple__slots__

4

1 回答 1

2

可以使用namedtuple; 自己从第一行构建它:

with open(filename, 'rb') as h:
    data = csv.reader(h)
    headers = next(data)
    RowTuple = namedtuple('RowTuple', headers)
    for row in data:
        row = RowTuple(row)

这基本上就是DictReader()这样做的;从第一行拿钥匙。

请注意,代码使用;DictReader()创建字典 dict(zip(self.fieldnames, row))这会为每一行重用相同的字符串,唯一的内存开销是dict表本身加上键的哈希值(每次都会重新计算并缓存这些值)。不会为每一行重新创建键的字符串。该namedtuple方法也没有,但不需要保留哈希,因为__slots__使用了。

于 2013-05-27T09:16:40.137 回答