2015-02-03 10 views
0

Я «псевдо» создаю файл .bib, читая файл csv, а затем следую за этим structure записывая все, включая символы новой строки. Это утомительный процесс, но это необработанная форма при преобразовании csv в .bib в python.Python Pandas метод iterrows

Я использую Pandas для чтения csv и записи строки за строкой (и поскольку у него есть специальные символы, я использую latin1 encoder), но у меня возникает огромная проблема: он читает только первую строку. Из официального documentation я использую свой метод на чтение построчно, который только дает мне первую строку (пример 1):

row = next(df.iterrows())[1] 

Но если я удалю следующий() и [1] он дает мне содержимое каждого столбца сосредоточено в одном поле (пример 2).

Почему это происходит? Почему использование метода в документах не проходит через все строки красиво? Каким будет решение, например, 1, но для всех строк?

Мой код:

import csv 
import pandas 
import bibtexparser 
import codecs 

colnames = ['AUTORES', 'TITULO', 'OUTROS', 'DATA','NOMEREVISTA','LOCAL','VOL','NUM','PAG','PAG2','ISBN','ISSN','ISSN2','ERC','IF','DOI','CODEN','WOS','SCOPUS','URL','CODIGO BIBLIOGRAFICO','INDEXAÇÕES', 
     'EXTRAINFO','TESTE'] 
data = pandas.read_csv('test1.csv', names=colnames, delimiter =r";", encoding='latin1')#, nrows=1 

df = pandas.DataFrame(data=data) 

with codecs.open('test1.txt', 'w', encoding='latin1') as fh: 
    fh.write('@Book{Arp, ') 
    fh.write('\n') 

rl = data.iterrows() 

for i in rl: 
    ix = str(i) 
    fh.write(' Title     = {') 
    fh.write(ix) 
    fh.write('}') 
    fh.write('\n') 

PS: Я новичок в Python и программирования, я знаю, что этот код имеет недостатки, и это не самый эффективный способ преобразовать CSV в нагрудник.

+0

Пример 1: HTTP: //pastebin.com/HaZUgKpe Пример 2: HTTP: //pastebin.com/cScWse2G –

+0

'iterrows' дает вам' (index, row) 'кортеж на каждой итерации. Лучший способ использовать его, как правило, делать 'для ix, row в data.iterrows():', не используя 'next()'. – Marius

ответ

1

Пример row = next(df.iterrows())[1] намеренно только возвращает первую строку.

df.iterrows() возвращает generator более кортежи, описывающие ряды. Первая запись кортежа содержит индекс строки, а вторая запись - серия панд с вашими данными строки.

Следовательно, next(df.iterrows()) возвращает следующую запись генератора. Если next еще не был вызван, это самый первый кортеж. Соответственно, next(df.iterrows())[1] возвращает первую строку (т. Е. Вторую запись кортежа) в виде серии панд.

То, что вы ищете, вероятно, что-то вроде этого:

for row_index, row in df.iterrows(): 
    convert_to_bib(row) 

Во-вторых, все ваши письма в файл обрабатывать fh должно происходить в пределах блока with codecs.open('test1.txt', 'w', encoding='latin1') as fh: , потому что в конце блока дескриптор файла воли быть закрытым.

Например:

with codecs.open('test1.txt', 'w', encoding='latin1') as fh: 
    # iterate through all rows 
    for row_index, row in df.iterrows(): 
     # iterate through all elements in the row 
     for colname in df.columns: 
      row_element = row[colname] 
      fh.write('%s = {%s},\n' % (colname, str(row_element))) 

Тем не менее я не уверен, если имена столбцов точно соответствуют BibTeX поля, которые вы имеете в виду. Вероятно, вам нужно их перенести. Но я надеюсь, что вы получите за принцип итераций :-)

Смежные вопросы