您好,登錄后才能下訂單哦!
小編給大家分享一下Python3爬蟲中JSON文件的存儲操作,希望大家閱讀完這篇文章后大所收獲,下面讓我們一起去探討吧!
JSON,全稱為JavaScript Object Notation, 也就是JavaScript對象標(biāo)記,它通過對象和數(shù)組的組合來表示數(shù)據(jù),構(gòu)造簡潔但是結(jié)構(gòu)化程度非常高,是一種輕量級的數(shù)據(jù)交換格式。本節(jié)中,我們就來了解如何利用Python保存數(shù)據(jù)到JSON文件。
1. 對象和數(shù)組
在JavaScript語言中,一切都是對象。因此,任何支持的類型都可以通過JSON來表示,例如字符串、數(shù)字、對象、數(shù)組等,但是對象和數(shù)組是比較特殊且常用的兩種類型,下面簡要介紹一下它們。
對象:它在JavaScript中是使用花括號{}包裹起來的內(nèi)容,數(shù)據(jù)結(jié)構(gòu)為{key1:value1, key2:value2, ...}的鍵值對結(jié)構(gòu)。在面向?qū)ο蟮恼Z言中,key為對象的屬性,value為對應(yīng)的值。鍵名可以使用整數(shù)和字符串來表示。值的類型可以是任意類型。
數(shù)組:數(shù)組在JavaScript中是方括號[]包裹起來的內(nèi)容,數(shù)據(jù)結(jié)構(gòu)為["java", "javascript", "vb", ...]的索引結(jié)構(gòu)。在JavaScript中,數(shù)組是一種比較特殊的數(shù)據(jù)類型,它也可以像對象那樣使用鍵值對,但還是索引用得多。同樣,值的類型可以是任意類型。
所以,一個JSON對象可以寫為如下形式:
[{ "name": "Bob", "gender": "male", "birthday": "1992-10-18" }, { "name": "Selina", "gender": "female", "birthday": "1995-10-18" }]
由中括號包圍的就相當(dāng)于列表類型,列表中的每個元素可以是任意類型,這個示例中它是字典類型,由大括號包圍。
JSON可以由以上兩種形式自由組合而成,可以無限次嵌套,結(jié)構(gòu)清晰,是數(shù)據(jù)交換的極佳方式。
2. 讀取JSON
Python為我們提供了簡單易用的庫來實現(xiàn)JSON文件的讀寫操作,我們可以調(diào)用庫的loads()方法將JSON文本字符串轉(zhuǎn)為JSON對象,可以通過dumps()方法將JSON對象轉(zhuǎn)為文本字符串。
例如,這里有一段JSON形式的字符串,它是str類型,我們用Python將其轉(zhuǎn)換為可操作的數(shù)據(jù)結(jié)構(gòu),如列表或字典:
import json str = ''' [{ "name": "Bob", "gender": "male", "birthday": "1992-10-18" }, { "name": "Selina", "gender": "female", "birthday": "1995-10-18" }] ''' print(type(str)) data = json.loads(str) print(data) print(type(data))
運行結(jié)果如下:
<class 'str'> [{'name': 'Bob', 'gender': 'male', 'birthday': '1992-10-18'}, {'name': 'Selina', 'gender': 'female', 'birthday': '1995-10-18'}] <class 'list'>
這里使用loads()方法將字符串轉(zhuǎn)為JSON對象。由于最外層是中括號,所以最終的類型是列表類型。
這樣一來,我們就可以用索引來獲取對應(yīng)的內(nèi)容了。例如,如果想取第一個元素里的name屬性,就可以使用如下方式:
data[0]['name'] data[0].get('name')
得到的結(jié)果都是:
Bob
通過中括號加0索引,可以得到第一個字典元素,然后再調(diào)用其鍵名即可得到相應(yīng)的鍵值。獲取鍵值時有兩種方式,一種是中括號加鍵名,另一種是通過get()方法傳入鍵名。這里推薦使用get()方法,這樣如果鍵名不存在,則不會報錯,會返回None。另外,get()方法還可以傳入第二個參數(shù)(即默認(rèn)值),示例如下:
data[0].get('age') data[0].get('age', 25)
運行結(jié)果如下:
None 25
這里我們嘗試獲取年齡age,其實在原字典中該鍵名不存在,此時默認(rèn)會返回None。如果傳入第二個參數(shù)(即默認(rèn)值),那么在不存在的情況下返回該默認(rèn)值。
值得注意的是,JSON的數(shù)據(jù)需要用雙引號來包圍,不能使用單引號。例如,若使用如下形式表示,則會出現(xiàn)錯誤:
import json str = ''' [{ 'name': 'Bob', 'gender': 'male', 'birthday': '1992-10-18' }] ''' data = json.loads(str)
運行結(jié)果如下:
json.decoder.JSONDecodeError: Expecting property name enclosed in double quotes: line 3 column 5 (char 8)
這里會出現(xiàn)JSON解析錯誤的提示。這是因為這里數(shù)據(jù)用單引號來包圍,請千萬注意JSON字符串的表示需要用雙引號,否則loads()方法會解析失敗。
如果從JSON文本中讀取內(nèi)容,例如這里有一個data.文本文件,其內(nèi)容是剛才定義的JSON字符串,我們可以先將文本文件內(nèi)容讀出,然后再利用loads()方法轉(zhuǎn)化:
import json with open('data.json', 'r') as file: str = file.read() data = json.loads(str) print(data)
運行結(jié)果如下:
[{'name': 'Bob', 'gender': 'male', 'birthday': '1992-10-18'}, {'name': 'Selina', 'gender': 'female', 'birthday': '1995-10-18'}]
3. 輸出JSON
另外,我們還可以調(diào)用dumps()方法將JSON對象轉(zhuǎn)化為字符串。例如,將上例中的列表重新寫入文本:
import json data = [{ 'name': 'Bob', 'gender': 'male', 'birthday': '1992-10-18' }] with open('data.json', 'w') as file: file.write(json.dumps(data))
利用dumps()方法,我們可以將JSON對象轉(zhuǎn)為字符串,然后再調(diào)用文件的write()方法寫入文本,結(jié)果如圖5-2所示。
另外,如果想保存JSON的格式,可以再加一個參數(shù)indent,代表縮進(jìn)字符個數(shù)。示例如下:
with open('data.json', 'w') as file: file.write(json.dumps(data, indent=2))
此時寫入結(jié)果如圖5-3所示。
這樣得到的內(nèi)容會自動帶縮進(jìn),格式會更加清晰。
另外,如果JSON中包含中文字符,會怎么樣呢?例如,我們將之前的JSON的部分值改為中文,再用之前的方法寫入到文本:
import json data = [{ 'name': '王偉', 'gender': '男', 'birthday': '1992-10-18' }] with open('data.json', 'w') as file: file.write(json.dumps(data, indent=2))
寫入結(jié)果如圖5-4所示。
可以看到,中文字符都變成了Unicode字符,這并不是我們想要的結(jié)果。
為了輸出中文,還需要指定參數(shù)ensure_ascii為False,另外還要規(guī)定文件輸出的編碼:
with open('data.json', 'w', encoding='utf-8') as file: file.write(json.dumps(data, indent=2, ensure_ascii=False))
寫入結(jié)果如圖5-5所示。
可以發(fā)現(xiàn),這樣就可以輸出JSON為中文了。
看完了這篇文章,相信你對Python3爬蟲中JSON文件的存儲操作有了一定的了解,想了解更多相關(guān)知識,歡迎關(guān)注億速云行業(yè)資訊頻道,感謝各位的閱讀!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。