обновление полей pyzotero навалом - PullRequest
0 голосов
/ 24 мая 2019

Я относительно новичок в Python, с чуть более чем годовым опытом программирования на R.

Я пытаюсь написать код, который поможет мне обновить определенные поля в моей библиотеке Zotero, чтобы они соответствовали цитированиюстандарты.

Я заметил, что поле author в Zotero может быть сопоставлено с различными элементами в словаре объекта.

from pyzotero import zotero as z

zot = z.Zotero(library_id, library_type, api_key, preserve_json_order=True)

zot.collections()

song_historiography=zot.collection_items('GLN5VY3Z')

x=int()
song_historiography[x]['data']['creators']

Изменяя значения x, я вижу различные структуры данных, в которых хранится имя автора.

[{'creatorType': 'author', 'name': '舒仁輝'}]

[{'creatorType': 'author', 'firstName': 'On Cho', 'lastName': 'Ng'},
 {'creatorType': 'author', 'firstName': 'Q. Edward', 'lastName': 'Wang'}]

[{'creatorType': 'author', 'firstName': 'Peter K.', 'lastName': 'Bol'},
 {'creatorType': 'editor',
  'firstName': 'Dieter Kuhn',
  'lastName': 'Helga Stahl'}]

Как получить доступ к полям name, firstName и lastName для коллекции в целом (коллективно и / или по отдельности), чтобы изменения в них можно было вносить непосредственно через код?

1 Ответ

1 голос
/ 24 мая 2019

Я думаю, DataFrame из pandas - хорошее решение для вас.

import pandas as pd

Прежде всего, я объединил данные, разделенные в один список.

data = [
        [{'creatorType': 'author', 'name': '舒仁輝'}],
        [{'creatorType': 'author', 'firstName': 'On Cho', 'lastName': 'Ng'},
         {'creatorType': 'author', 'firstName': 'Q. Edward', 'lastName': 'Wang'}],
        [{'creatorType': 'author', 'firstName': 'Peter K.', 'lastName': 'Bol'},
         {'creatorType': 'editor', 'firstName': 'Dieter Kuhn', 'lastName': 'Helga Stahl'}]
       ]

authors = []
for d in data: authors += d
print (authors)
[{'creatorType': 'author', 'name': '舒仁輝'}, {'creatorType': 'author', 'firstName': 'On Cho', 'lastName': 'Ng'}, {'creatorType': 'author', 'firstName': 'Q. Edward', 'lastName': 'Wang'}, {'creatorType': 'author', 'firstName': 'Peter K.', 'lastName': 'Bol'}, {'creatorType': 'editor', 'firstName': 'Dieter Kuhn', 'lastName': 'Helga Stahl'}]

Создан DataFrame из authors

df = pd.DataFrame(authors)
print (df)
  creatorType    firstName     lastName name
0      author          NaN          NaN  舒仁輝
1      author       On Cho           Ng  NaN
2      author    Q. Edward         Wang  NaN
3      author     Peter K.          Bol  NaN
4      editor  Dieter Kuhn  Helga Stahl  NaN

И я сделал пример для установки значения для конкретного элемента.

df.at[df.name == '舒仁輝','firstName'] = 'John'
df.at[df.firstName.str.contains('Cho'), 'creatorType'] = 'editor'
print (df)
  creatorType    firstName     lastName name
0      author         John          NaN  舒仁輝
1      editor       On Cho           Ng  NaN
2      author    Q. Edward         Wang  NaN
3      author     Peter K.          Bol  NaN
4      editor  Dieter Kuhn  Helga Stahl  NaN
...