我是“伪”通过读取csv文件创建.bib文件,然后按照structure写下包括换行符在内的所有内容。这是一个繁琐的过程,但它是在python中将csv转换为.bib的原始形式。
我正在使用Pandas来读取csv并逐行写入(因为它有特殊字符我正在使用latin1编码器)但是我遇到了一个很大的问题:它只读取第一行。来自官方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转换为bib的最有效方法。
答案 0 :(得分:1)
示例row = next(df.iterrows())[1]
故意仅返回第一行。
df.iterrows()
会在元组上返回generator来描述这些行。元组的第一个条目包含行索引,第二个条目是一个包含行数据的pandas系列。
因此,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字段完全匹配。可能你必须先转换它们。但我希望你能得到迭代背后的原理: - )