Хранить похожие ключи в списке словарей как тот же столбец в файле CSV - PullRequest
0 голосов
/ 05 марта 2019

Предположим, у меня есть следующий список словарей:

citation = [{'ID':'101',
             'SENTENCE':'This is a theory sample from a book.'
             'AUTHOR':'ALEX B.',
             'AUTHOR1':'JOHN K.',
             'TITLE':'BASIC PROGRAMMING',
             'URL':'an.example.com',
             'YEAR':'2010'},
            {'ID':'102',
             'SENTENCE':'This is a theory from book 1 and book 2',
             'AUTHOR':'MARINA E.',
             'TITLE':'BE A GOOD PROGRAMMER',
             'YEAR':'2011',
             'AUTHOR1':'STEVE M.',
             'AUTHOR2':'DIANE L.',
             'TITLE1':'I AM AN ENGINEER',
             'YEAR1':'2013',
             'VOLUME':'10'},
            {.. other data...},
           ]

Мне нужно сохранить этот список словарей в файл csv.Если ключ в словаре похож (AUTHOR = AUTHOR1 = AUTHOR2, TITLE = TITLE1 = TITLE2 и т. Д.), Поместите его в тот же столбец без номера в имени столбца (AUTHOR, TITLE, YEAR).Если значение данных в столбце больше одного, они должны быть разделены точкой с запятой (;).Кроме того, имена ключей и их порядок в каждом словаре иногда отличаются от других словарей в списке.

Это мой код, но он не работает, потому что похожие ключи в словаре хранятся как разныеимена полей:

outpath = 'mycitation.csv'
outfile = open(outpath, 'w')

fields = (list(set(k for d in citation for k in d)))
writer = csv.DictWriter(outfile, fieldnames=field, dialect='excel')

writer.writeheader()
for row in citation:
    writer.writerow(row)
outfile.close()

Вывод, который мне нужно получить в файле csv:

ID  | SENTENCE                                | AUTHOR                      | TITLE                                  | YEAR       | URL             | VOLUME 
--------------------------------------------------------------------------------------------------------------------------------------------------------------
101 | This is a theory sample from a book.    | ALEX B.;JOHN K.             | BASIC PROGRAMMING                      | 2010       | an.example.com  |
102 | This is a theory from book 1 and book 2 | MARINA E.;STEVE M.;DIANE L. | BE A GOOD PROGRAMMER; I AM AN ENGINEER | 2011; 2013 |                 | 10

1 Ответ

0 голосов
/ 05 марта 2019

Вы можете использовать метод dict.get() в сочетании с форматированием строки.

for i in citation:
    authors = [i.get("AUTHOR","")]
    titles = [i.get("TITLE","")]
    for x in range(1,10):
        authors.append(i.get("AUTHOR{}".format(x),""))
        titles.append(i.get("TITLE{}".format(x),""))
    a_result,t_result = ";".join(a for a in authors if a),"; ".join(t for t in titles if t)
    print (a_result+"|"+t_result)

Результат:

ALEX B.;JOHN K.|BASIC PROGRAMMING
MARINA E.;STEVE M.;DIANE L.|BE A GOOD PROGRAMMER; I AM AN ENGINEER
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...