2017-09-27 132 views
0

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

在数据库文件的每一行中,很多信息存储在作者,文章和主题区域中。一个片段是这样的:

{"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-标识符和学科领域的信息文件。

+2

数据看起来像是JSON,所以在从数据库中读取数据(例如'c.execute(“select * from responses;”')之后,遍历结果并使用Python的'json'库加载每个然后将其存储到Python数据结构中,从中可以提取所需的信息,然后将其存储为您希望用于分析或导出的任何其他格式 –

+0

非常感谢!我仍然是Python(和json)的初学者, ,所以现在我被困在如何遍历整个文件中,如何使用json将每一行加载到数据结构中?任何建议或想法都将非常有帮助 –

+1

查看下面添加的回答 –

回答

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库导出该数据库,也可以将其作为新表格推回到数据库中,以便进一步查询。

+0

这是真的,真的太棒了 - 非常感谢,现在我快到了,问题是相关信息似乎在'row [6]'中,所以命令应该使用'json.loads(row [6]) '我明白了第一个作者ID,但脚本停止工作。你一直很有帮助,所以随时停止帮助,这只是比我想象的更复杂。 –

+1

您可以修改SELECT语句以仅获取您需要的列(即第7个)而不是'*',这可能会更快一些,并且使用少一点的内存。你可以在行中使用'rows = curs.fetchall()',然后在行中使用'':' - 这可以让你检查返回的数据。您可能还需要使用'json.loads()'命令指定编码。 –