使用Python从SQL表中获取信息

时间:2017-09-27 21:03:12

标签: python sql sqlite scopus

我有一个20gb的数据库文件(* .db),其中包含从Scopus获得的大量有关科学文章的信息。大多数信息存储在数据库文件的响应表中。我只想从每篇发表的文章中获取主题领域。我不知道如何从数据库文件中获取此信息。

在数据库文件的每一行中,很多信息都存储在作者,文章以及主题领域。一个片段看起来像这样:

{"abstracts-retrieval-response":{"coredata":{"prism:url":"http://api.elsevier.com/content/abstract/scopus_id/85012897283","dc:identifier":"SCOPUS_ID:85012897283","eid":"2-s2.0-85012897283","language":{"@xml:lang": "eng"},"authkeywords":{"author-keyword": [{"@_fa": "true", "$" :"austerity policies"},{"@_fa": "true", "$" :"housing policy"},{"@_fa": "true", "$" :"Italy"},{"@_fa": "true", "$" :"Mediterranean welfare regime"},{"@_fa": "true", "$" :"Neoliberalism"},{"@_fa": "true", "$" :"Spain"}]},"idxterms":null,"subject-areas":{"subject-area": [{"@_fa": "true", "@abbrev": "SOCI", "@code": "3303", "$" :"Development"},{"@_fa": "true", "@abbrev": "SOCI", "@code": "3322", "$" :"Urban Studies"},{"@_fa": "true", "@abbrev": "ENVI", "@code": "2308", "$" :"Management, Monitoring, Policy and Law"}]}}

从这个庞大的(但实际上甚至更大)表中,我只对获得dc-identifier和(多个)主题区感兴趣。理想情况下,我会将它们放在* .csv文件中。

有没有一种直接的方法可以使用Python从* .db文件中获取此信息?使用 sqlite3 我似乎可以使用以下代码访问数据库:

import sqlite3
conn = sqlite3.connect('C:/responses.db')       
c = conn.cursor()

对我来说,现在还不清楚我现在只能从数据库文件中获取dc-identifier和subject-areas信息。

1 个答案:

答案 0 :(得分:1)

使用json.loads()函数会将输入的JSON字符串转换为由一组分层的字典和列表组成的Python对象。然后,您需要使用标准Python运算符从中提取信息。以下是一个示例,但我不确定该示例是否提取了正确的文档ID。这也是未经测试的,因此您可能需要调整或更正它。此外,您的示例输入具有不平衡的花括号,因此下面使用的结构的解释可能不太正确。

import sqlite3
import json

conn = sqlite3.connect('C:/responses.db')       
c = conn.cursor()

# Initialize the output list.
subjectlist = []

# Get the data from SQLite.
c.execute("select * from responses;")

# Iterate over all the rows of data
for row in c:
    # Extract and save the subject information.
    article = json.loads(row[0])
    doc_id = article["abstracts-retrieval-response"]["coredata"]["dc:identifier"]
    subjects = [s["$"] for s in article["abstracts-retrieval-response"]["coredata"]["subject-areas"]["subject-area"]]
    for s in subjects:
        subjectlist.append([doc_id, s])

在此代码结束时,subjectlist将是两个元素列表的列表,后者各自由文档ID和主题区域组成。然后,您可以使用csv库将其导出,或者将其作为新表推回到数据库中,以便进一步查询。

相关问题