2017-09-27 166 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()'命令指定編碼。 –