91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Python3爬蟲中JSON文件的存儲操作

發布時間:2020-08-05 17:31:43 來源:億速云 閱讀:151 作者:小新 欄目:編程語言

小編給大家分享一下Python3爬蟲中JSON文件的存儲操作,希望大家閱讀完這篇文章后大所收獲,下面讓我們一起去探討吧!

JSON,全稱為JavaScript Object Notation, 也就是JavaScript對象標記,它通過對象和數組的組合來表示數據,構造簡潔但是結構化程度非常高,是一種輕量級的數據交換格式。本節中,我們就來了解如何利用Python保存數據到JSON文件。

1. 對象和數組

在JavaScript語言中,一切都是對象。因此,任何支持的類型都可以通過JSON來表示,例如字符串、數字、對象、數組等,但是對象和數組是比較特殊且常用的兩種類型,下面簡要介紹一下它們。

對象:它在JavaScript中是使用花括號{}包裹起來的內容,數據結構為{key1:value1, key2:value2, ...}的鍵值對結構。在面向對象的語言中,key為對象的屬性,value為對應的值。鍵名可以使用整數和字符串來表示。值的類型可以是任意類型。

數組:數組在JavaScript中是方括號[]包裹起來的內容,數據結構為["java", "javascript", "vb", ...]的索引結構。在JavaScript中,數組是一種比較特殊的數據類型,它也可以像對象那樣使用鍵值對,但還是索引用得多。同樣,值的類型可以是任意類型。

所以,一個JSON對象可以寫為如下形式:

[{
    "name": "Bob",
    "gender": "male",
    "birthday": "1992-10-18"
}, {
     "name": "Selina",
    "gender": "female",
    "birthday": "1995-10-18"
}]

由中括號包圍的就相當于列表類型,列表中的每個元素可以是任意類型,這個示例中它是字典類型,由大括號包圍。

JSON可以由以上兩種形式自由組合而成,可以無限次嵌套,結構清晰,是數據交換的極佳方式。

2. 讀取JSON

Python為我們提供了簡單易用的庫來實現JSON文件的讀寫操作,我們可以調用庫的loads()方法將JSON文本字符串轉為JSON對象,可以通過dumps()方法將JSON對象轉為文本字符串。

例如,這里有一段JSON形式的字符串,它是str類型,我們用Python將其轉換為可操作的數據結構,如列表或字典:

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))

運行結果如下:

<class 'str'>
[{'name': 'Bob', 'gender': 'male', 'birthday': '1992-10-18'}, {'name': 'Selina', 'gender': 'female', 'birthday': 
'1995-10-18'}]
<class 'list'>

這里使用loads()方法將字符串轉為JSON對象。由于最外層是中括號,所以最終的類型是列表類型。

這樣一來,我們就可以用索引來獲取對應的內容了。例如,如果想取第一個元素里的name屬性,就可以使用如下方式:

data[0]['name']
data[0].get('name')

得到的結果都是:

Bob

通過中括號加0索引,可以得到第一個字典元素,然后再調用其鍵名即可得到相應的鍵值。獲取鍵值時有兩種方式,一種是中括號加鍵名,另一種是通過get()方法傳入鍵名。這里推薦使用get()方法,這樣如果鍵名不存在,則不會報錯,會返回None。另外,get()方法還可以傳入第二個參數(即默認值),示例如下:

data[0].get('age')
data[0].get('age', 25)

運行結果如下:

None
25

這里我們嘗試獲取年齡age,其實在原字典中該鍵名不存在,此時默認會返回None。如果傳入第二個參數(即默認值),那么在不存在的情況下返回該默認值。

值得注意的是,JSON的數據需要用雙引號來包圍,不能使用單引號。例如,若使用如下形式表示,則會出現錯誤:

import json
str = '''
[{
    'name': 'Bob',
    'gender': 'male',
    'birthday': '1992-10-18'
}]
'''
data = json.loads(str)

運行結果如下:

json.decoder.JSONDecodeError: Expecting property name enclosed in double quotes: line 3 column 5 (char 8)

這里會出現JSON解析錯誤的提示。這是因為這里數據用單引號來包圍,請千萬注意JSON字符串的表示需要用雙引號,否則loads()方法會解析失敗。

如果從JSON文本中讀取內容,例如這里有一個data.文本文件,其內容是剛才定義的JSON字符串,我們可以先將文本文件內容讀出,然后再利用loads()方法轉化:

import json
with open('data.json', 'r') as file:
    str = file.read()
    data = json.loads(str)
    print(data)

運行結果如下:

[{'name': 'Bob', 'gender': 'male', 'birthday': '1992-10-18'}, {'name': 'Selina', 'gender': 'female', 'birthday': 
'1995-10-18'}]

3. 輸出JSON

另外,我們還可以調用dumps()方法將JSON對象轉化為字符串。例如,將上例中的列表重新寫入文本:

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對象轉為字符串,然后再調用文件的write()方法寫入文本,結果如圖5-2所示。

Python3爬蟲中JSON文件的存儲操作

另外,如果想保存JSON的格式,可以再加一個參數indent,代表縮進字符個數。示例如下:

with open('data.json', 'w') as file:
    file.write(json.dumps(data, indent=2))

此時寫入結果如圖5-3所示。

Python3爬蟲中JSON文件的存儲操作

這樣得到的內容會自動帶縮進,格式會更加清晰。

另外,如果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))

寫入結果如圖5-4所示。

Python3爬蟲中JSON文件的存儲操作

可以看到,中文字符都變成了Unicode字符,這并不是我們想要的結果。

為了輸出中文,還需要指定參數ensure_ascii為False,另外還要規定文件輸出的編碼:

with open('data.json', 'w', encoding='utf-8') as file:
    file.write(json.dumps(data, indent=2, ensure_ascii=False))

寫入結果如圖5-5所示。

Python3爬蟲中JSON文件的存儲操作

可以發現,這樣就可以輸出JSON為中文了。

看完了這篇文章,相信你對Python3爬蟲中JSON文件的存儲操作有了一定的了解,想了解更多相關知識,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

尼玛县| 江门市| 威宁| 淄博市| 轮台县| 南川市| 湖州市| 靖边县| 台安县| 四会市| 巴塘县| 文山县| 慈溪市| 连城县| 象州县| 丹棱县| 宁陕县| 武胜县| 田东县| 思茅市| 兴文县| 平湖市| 大兴区| 渝北区| 于都县| 巴里| 易门县| 凌云县| 鹰潭市| 武邑县| 彭阳县| 星子县| 理塘县| 北川| 济源市| 西藏| 嫩江县| 宜君县| 东莞市| 武穴市| 遵义市|