как портировать объект читателя csv (dict) в python 3.2? - PullRequest
0 голосов
/ 11 сентября 2011

Я пытаюсь использовать пул из многопроцессорного модуля для ускорения чтения больших файлов 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)

1 Ответ

1 голос
/ 08 ноября 2011

Из документации csv.DictReader (и класса csv.reader это его подклассы) класс возвращает итератор. Код должен был выдать TypeError, когда вы позвонили len().

Вы все еще можете разделить данные на части, но вам придется полностью прочитать их в память. Если вас беспокоит память, вы можете переключиться с csv.DictReader на csv.reader и пропустить служебные словари, создаваемые csv.DictReader. Чтобы улучшить читабельность в csv2nodes(), вы можете назначить константы для адресации индекса каждого поля:

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

Я также рекомендую использовать переменную, отличную от id, поскольку это имя встроенной функции.

...