-->

如何块的CSV(字典)读取器在python 3.2对象?(how to chunk a csv (d

2019-10-30 02:20发布

我尝试使用游泳池,距离多模块,加快阅读大量的CSV文件。 对于这一点,我适应一个例子 (从py2k),但它似乎像csv.dictreader对象没有长度。 这是否意味着我只能迭代它? 有没有一种方法,以块仍?

这些问题似乎有关,但并没有真正回答我的问题: 在csv.DictReader行数 , 如何块在Python 3列表?

我的代码试图做到这一点:

source = open('/scratch/data.txt','r')
def csv2nodes(r):
    strptime = time.strptime
    mktime = time.mktime
    l = []
    ppl = set()
    for row in r:
        cell = int(row['cell'])
        id = int(row['seq_ei'])
        st = mktime(strptime(row['dat_deb_occupation'],'%d/%m/%Y'))
        ed = mktime(strptime(row['dat_fin_occupation'],'%d/%m/%Y'))
        # collect list
        l.append([(id,cell,{1:st,2: ed})])
        # collect separate sets
        ppl.add(id)
    return (l,ppl)


def csv2graph(source):
    r = csv.DictReader(source,delimiter=',')
    MG=nx.MultiGraph()
    l = []
    ppl = set()
    # Remember that I use integers for edge attributes, to save space! Dic above.
    # start: 1
    # end: 2
    p = Pool(processes=4)
    node_divisor = len(p._pool)*4
    node_chunks = list(chunks(r,int(len(r)/int(node_divisor))))
    num_chunks = len(node_chunks)
    pedgelists = p.map(csv2nodes,
                       zip(node_chunks))
    ll = []
    for l in pedgelists:
        ll.append(l[0])
        ppl.update(l[1])
    MG.add_edges_from(ll)
    return (MG,ppl)

Answer 1:

csv.DictReader文档 (以及csv.reader它的子类类),类返回迭代器。 该代码应该扔了一个TypeError时,你叫len()

你仍然可以大块数据,但你必须把它完整地读到内存中。 如果你担心内存,你可以从切换csv.DictReadercsv.reader并跳过字典的开销csv.DictReader创建。 为了提高可读性csv2nodes()您可以分配常数,以解决各领域的指标:

CELL = 0
SEQ_EI = 1
DAT_DEB_OCCUPATION = 4
DAT_FIN_OCCUPATION = 5

我还建议使用较不同的变量id ,因为这是一个内置的函数名。



文章来源: how to chunk a csv (dict)reader object in python 3.2?