我正在使用csv.DictReader将一些大文件读入内存然后进行一些分析,因此来自多个CSV文件的所有对象都需要保存在内存中。我需要将它们作为字典阅读以使分析更容易,并且因为可以通过添加新列来更改CSV文件。
是的,可以使用SQL,但如果不需要,我宁愿避免使用它。
我想知道是否有更好更简单的方法。我担心的是,我会有许多具有相同键和浪费内存的字典对象?使用__slots__
是一个选项,但我只会在读取CSV后知道对象的属性。
[编辑:]由于使用遗留系统和“限制”,因此无法使用第三方库。
答案 0 :(得分:2)
如果您使用的是Python 2.6或更高版本,collections.namedtuple
就是您所要求的。
参见http://docs.python.org/library/collections.html#collections.namedtuple (甚至有一个与csv一起使用的例子)。
编辑:它要求字段名称作为Python标识符有效,所以它可能不适合你的情况。
答案 1 :(得分:1)
您是否考虑过使用pandas。
它对表非常有用。与您相关的是read_csv函数和dataframe类型。
这就是你如何使用它:
>>> import pandas
>>> table = pandas.read_csv('a.csv')
>>> table
a b c
0 1 2 a
1 2 4 b
2 5 6 word
>>> table.a
0 1
1 2
2 5
Name: a
答案 2 :(得分:0)
使用python shelve。它是一个类似于对象的字典,但可以在需要时转储到磁盘上,并且很容易加载回来。
答案 3 :(得分:0)
如果一列中的所有数据都是同一类型,则可以使用NumPy。 NumPy的loadtxt和genfromtxt函数可用于读取csv文件。因为它返回一个数组,所以内存使用量小于dict。
答案 4 :(得分:0)
的可能性:
(1)对csv.DictReader方法进行基准测试,看它是否会导致问题。请注意,dicts包含键和值的POINTERS;实际的键字符串不会复制到每个字典中。
(2)对于每个文件,使用csv.Reader,在第一行之后,动态构建一个类,每个剩余行实例化一次。也许这就是你的想法。
(3)有一个固定类,每个文件实例化一次,它为您提供实际数据的元组列表,将列索引映射到列名称的元组,以及将列名称映射到列索引的字典。元组占用的内存少于列表,因为没有分配额外的附加空间。然后,您可以通过(row_index,column_index)和(row_index,column_name)获取和设置数据。
在任何情况下,为了获得更好的建议,如何处理一些简单的事实和统计数据:什么版本的Python?多少个文件?每个文件的行数?每个文件的列?总唯一键/列名?