使用 Python 从 SQL table 获取信息
Getting information from SQL table with Python
我有一个 20gb 的数据库文件 (*.db),其中包含大量从 Scopus 获取的科学文章信息。大多数信息存储在数据库文件中的响应 table 中。我只想从每篇发表的文章中获取主题领域。我不知道如何从数据库文件中获取它。
在数据库文件的每一行中,都存储了很多关于作者、文章和主题区域的信息。片段如下所示:
{"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"}]}}
从这么大(但实际上更大)table,我只对获得 dc-identifier
和(多个)主题领域感兴趣。理想情况下,我会将它们放在 *.csv 文件中。
是否有使用 Python 从 *.db 文件中获取此信息的直接方法?使用 sqlite3 我似乎能够使用以下代码访问数据库:
import sqlite3
conn = sqlite3.connect('C:/responses.db')
c = conn.cursor()
我不清楚我现在如何只能从数据库文件中获取 dc-identifier 和 subject-areas 信息。
使用 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
库导出它,或者将它作为新的 table 推回数据库,以便进一步查询。
我有一个 20gb 的数据库文件 (*.db),其中包含大量从 Scopus 获取的科学文章信息。大多数信息存储在数据库文件中的响应 table 中。我只想从每篇发表的文章中获取主题领域。我不知道如何从数据库文件中获取它。
在数据库文件的每一行中,都存储了很多关于作者、文章和主题区域的信息。片段如下所示:
{"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"}]}}
从这么大(但实际上更大)table,我只对获得 dc-identifier
和(多个)主题领域感兴趣。理想情况下,我会将它们放在 *.csv 文件中。
是否有使用 Python 从 *.db 文件中获取此信息的直接方法?使用 sqlite3 我似乎能够使用以下代码访问数据库:
import sqlite3
conn = sqlite3.connect('C:/responses.db')
c = conn.cursor()
我不清楚我现在如何只能从数据库文件中获取 dc-identifier 和 subject-areas 信息。
使用 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
库导出它,或者将它作为新的 table 推回数据库,以便进一步查询。