詳解Python中數(shù)據(jù)的多種存儲(chǔ)形式
1 JSON 文件存儲(chǔ)
JSON,全稱為 JavaScript Object Notation, 也就是 JavaScript 對(duì)象標(biāo)記,它通過(guò)對(duì)象和數(shù)組的組合來(lái)表示數(shù)據(jù),構(gòu)造簡(jiǎn)潔但是結(jié)構(gòu)化程度非常高,是一種輕量級(jí)的數(shù)據(jù)交換格式。本節(jié)中,我們就來(lái)了解如何利用 Python 保存數(shù)據(jù)到 JSON 文件。
1. 對(duì)象和數(shù)組
在 JavaScript 語(yǔ)言中,一切都是對(duì)象。因此,任何支持的類型都可以通過(guò) JSON 來(lái)表示,例如字符串、數(shù)字、對(duì)象、數(shù)組等,但是對(duì)象和數(shù)組是比較特殊且常用的兩種類型,下面簡(jiǎn)要介紹一下它們。
對(duì)象:它在 JavaScript 中是使用花括號(hào) {} 包裹起來(lái)的內(nèi)容,數(shù)據(jù)結(jié)構(gòu)為 {key1:value1, key2:value2, ...} 的鍵值對(duì)結(jié)構(gòu)。在面向?qū)ο蟮恼Z(yǔ)言中,key 為對(duì)象的屬性,value 為對(duì)應(yīng)的值。鍵名可以使用整數(shù)和字符串來(lái)表示。值的類型可以是任意類型。
數(shù)組:數(shù)組在 JavaScript 中是方括號(hào) [] 包裹起來(lái)的內(nèi)容,數(shù)據(jù)結(jié)構(gòu)為 ["java", "javascript", "vb", ...] 的索引結(jié)構(gòu)。在 JavaScript 中,數(shù)組是一種比較特殊的數(shù)據(jù)類型,它也可以像對(duì)象那樣使用鍵值對(duì),但還是索引用得多。同樣,值的類型可以是任意類型。
所以,一個(gè) JSON 對(duì)象可以寫(xiě)為如下形式:
[{
"name": "Bob",
"gender": "male",
"birthday": "1992-10-18"
}, {
"name": "Selina",
"gender": "female",
"birthday": "1995-10-18"
}]由中括號(hào)包圍的就相當(dāng)于列表類型,列表中的每個(gè)元素可以是任意類型,這個(gè)示例中它是字典類型,由大括號(hào)包圍。
JSON 可以由以上兩種形式自由組合而成,可以無(wú)限次嵌套,結(jié)構(gòu)清晰,是數(shù)據(jù)交換的極佳方式。
import json
data = [{
'name': '王偉',
'gender': '男',
'birthday': '1992-10-18'
},{
'name': '張三',
'gender': '男',
'birthday': '1993-10-18'
}]
# w 寫(xiě)入 a r
with open('data.json', 'w', encoding='utf-8') as file:
file.write(json.dumps(data, indent=2, ensure_ascii=False))
# json.dumps 把字典轉(zhuǎn)json字符串
# .loads 反序列化 把json字符串轉(zhuǎn)字典
# indent 格式化
# ensure_ascii=False 中文不編碼
# java 必須要雙引號(hào)2 CSV 文件存儲(chǔ)
CSV,全稱為 Comma-Separated Values,中文可以叫作逗號(hào)分隔值或字符分隔值,其文件以純文本形式存儲(chǔ)表格數(shù)據(jù)。該文件是一個(gè)字符序列,可以由任意數(shù)目的記錄組成,記錄間以某種換行符分隔。每條記錄由字段組成,字段間的分隔符是其他字符或字符串,最常見(jiàn)的是逗號(hào)或制表符。不過(guò)所有記錄都有完全相同的字段序列,相當(dāng)于一個(gè)結(jié)構(gòu)化表的純文本形式。它比 Excel 文件更加簡(jiǎn)潔,XLS 文本是電子表格,它包含了文本、數(shù)值、公式和格式等內(nèi)容,而 CSV 中不包含這些內(nèi)容,就是特定字符分隔的純文本,結(jié)構(gòu)簡(jiǎn)單清晰。所以,有時(shí)候用 CSV 來(lái)保存數(shù)據(jù)是比較方便的。本節(jié)中,我們來(lái)講解 Python 讀取和寫(xiě)入 CSV 文件的過(guò)程。
1. 寫(xiě)入
這里先看一個(gè)最簡(jiǎn)單的例子:
import csv
with open('data.csv', 'w') as csvfile:
writer = csv.writer(csvfile)
writer.writerow(['id', 'name', 'age'])
writer.writerow(['10001', 'Mike', 20])
writer.writerow(['10002', 'Bob', 22])
writer.writerow(['10003', 'Jordan', 21])首先,打開(kāi) data.csv 文件,然后指定打開(kāi)的模式為 w(即寫(xiě)入),獲得文件句柄,隨后調(diào)用 csv 庫(kù)的 writer 方法初始化寫(xiě)入對(duì)象,傳入該句柄,然后調(diào)用 writerow 方法傳入每行的數(shù)據(jù)即可完成寫(xiě)入。
如果想修改列與列之間的分隔符,可以傳入 delimiter 參數(shù),其代碼如下:
import csv
with open('data.csv', 'w') as csvfile:
writer = csv.writer(csvfile, delimiter=' ')
writer.writerow(['id', 'name', 'age'])
writer.writerow(['10001', 'Mike', 20])
writer.writerow(['10002', 'Bob', 22])
writer.writerow(['10003', 'Jordan', 21])2.多行寫(xiě)入
調(diào)用 writerows 方法同時(shí)寫(xiě)入多行,此時(shí)參數(shù)就需要為二維列表,例如:
import csv
with open('data.csv', 'w') as csvfile:
writer = csv.writer(csvfile)
writer.writerow(['id', 'name', 'age'])
writer.writerows([['10001', 'Mike', 20], ['10002', 'Bob', 22], ['10003', 'Jordan', 21]])3.字典寫(xiě)入
用字典來(lái)表示。在 csv 庫(kù)中也提供了字典的寫(xiě)入方式,示例如下:
import csv
with open('data.csv', 'w') as csvfile:
fieldnames = ['id', 'name', 'age']
writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
writer.writeheader()
writer.writerow({'id': '10001', 'name': 'Mike', 'age': 20})
writer.writerow({'id': '10002', 'name': 'Bob', 'age': 22})
writer.writerow({'id': '10003', 'name': 'Jordan', 'age': 21})4. 爬蟲(chóng)采集入庫(kù)
import httpx
res = httpx.get('https://careers.tencent.com/tencentcareer/api/post/Query?timestamp=1647605552864&countryId=&cityId=&bgIds=&productId=&categoryId=&parentCategoryId=&attrId=&keyword=python&pageIndex=2&pageSize=10&language=zh-cn&area=cn')
# 數(shù)據(jù)變字典格式
items = res.json()
item = items.get('Data')['Posts'] # 列表形式
data = []
for i in item:
title = i.get('RecruitPostName'),
times = i.get('LastUpdateTime'),
data.append([title[0],times[0]])
import csv
with open('data2.csv', 'w',encoding='utf-8') as csvfile:
writer = csv.writer(csvfile)
writer.writerow(['id', 'name'])
writer.writerows(data)3 關(guān)系型數(shù)據(jù)庫(kù)存儲(chǔ)
關(guān)系型數(shù)據(jù)庫(kù)是基于關(guān)系模型的數(shù)據(jù)庫(kù),而關(guān)系模型是通過(guò)二維表來(lái)保存的,所以它的存儲(chǔ)方式就是行列組成的表,每一列是一個(gè)字段,每一行是一條記錄。表可以看作某個(gè)實(shí)體的集合,而實(shí)體之間存在聯(lián)系,這就需要表與表之間的關(guān)聯(lián)關(guān)系來(lái)體現(xiàn),如主鍵外鍵的關(guān)聯(lián)關(guān)系。多個(gè)表組成一個(gè)數(shù)據(jù)庫(kù),也就是關(guān)系型數(shù)據(jù)庫(kù)。
關(guān)系型數(shù)據(jù)庫(kù)有多種,如 SQLite、MySQL、Oracle、SQL Server、DB2 等。
1. 準(zhǔn)備工作
在開(kāi)始之前,請(qǐng)確保已經(jīng)安裝好了 MySQL 數(shù)據(jù)庫(kù)并保證它能正常運(yùn)行,而且需要安裝好 Py MySQL 庫(kù)。如果沒(méi)有安裝找班主任老師拿包
下載地址;https://dev.mysql.com/downloads/mysql/
安裝包:https://downloads.mysql.com/archives/get/p/23/file/mysql-5.7.9-winx64.zip
參考地址:http://chabaoo.cn/article/265139.htm
2. 連接數(shù)據(jù)庫(kù)
這里,首先嘗試連接一下數(shù)據(jù)庫(kù)。假設(shè)當(dāng)前的 MySQL 運(yùn)行在本地,用戶名為 root,密碼為 123456,運(yùn)行端口為 3306。這里利用 PyMySQL 先連接 MySQL,然后創(chuàng)建一個(gè)新的數(shù)據(jù)庫(kù),名字叫作 spiders,代碼如下:
import pymysql
db = pymysql.connect(host='localhost',user='root', password='123456', port=3306)
cursor = db.cursor() # 游標(biāo)
cursor.execute('SELECT VERSION()')
data = cursor.fetchone()
print('Database version:', data)
cursor.execute("CREATE DATABASE spiders DEFAULT CHARACTER SET utf8")
db.close()3. 創(chuàng)建數(shù)據(jù)表
import pymysql db = pymysql.connect(host='localhost', user='root', password='123456', port=3306, db='spiders') cursor = db.cursor() sql = 'CREATE TABLE IF NOT EXISTS students (id VARCHAR(255) NOT NULL, name VARCHAR(255) NOT NULL, age INT NOT NULL, PRIMARY KEY (id))' cursor.execute(sql) db.close()
4. 插入數(shù)據(jù)
插入、更新和刪除操作都是對(duì)數(shù)據(jù)庫(kù)進(jìn)行更改的操作,而更改操作都必須為一個(gè)事務(wù),所以這些操作的標(biāo)準(zhǔn)寫(xiě)法就是:
import pymysql
id = '20220315'
user = '菲菲'
age = 20
db = pymysql.connect(host='localhost', user='root', password='123456', port=3306, db='spiders')
cursor = db.cursor()
# %s 動(dòng)態(tài)傳參
sql = 'INSERT INTO students(id, name, age) values(% s, % s, % s)'
try:
cursor.execute(sql, (id, user, age))
db.commit()
except:
db.rollback()
db.close()5. 字典數(shù)據(jù)插入
data = {
'id':'20220315',
'name': '菲菲',
'age': 20
}
keys = ', '.join(data.keys())
values = ', '.join(['% s'] * len(data))
sql = 'INSERT INTO students({keys}) VALUES ({values})'.format( keys=keys, values=values)
try:
if cursor.execute(sql, tuple(data.values())):
print('Successful')
db.commit()
except:
print('Failed')
db.rollback()
db.close()6. 爬蟲(chóng)數(shù)據(jù)采集入庫(kù)
4 非關(guān)系型數(shù)據(jù)庫(kù)存儲(chǔ)
1. MongoDB簡(jiǎn)介
MongoDB 是由 C++ 語(yǔ)言編寫(xiě)的非關(guān)系型數(shù)據(jù)庫(kù),是一個(gè)基于分布式文件存儲(chǔ)的開(kāi)源數(shù)據(jù)庫(kù)系統(tǒng),其內(nèi)容存儲(chǔ)形式類似 JSON 對(duì)象,它的字段值可以包含其他文檔、數(shù)組及文檔數(shù)組,非常靈活。在這一節(jié)中,我們就來(lái)看看 Python 3 下 MongoDB 的存儲(chǔ)操作。
安裝地址
參考:https://www.runoob.com/mongodb/mongodb-linux-install.html
2. 連接 MongoDB
連接 MongoDB 時(shí),我們需要使用 PyMongo 庫(kù)里面的 MongoClient。一般來(lái)說(shuō),傳入 MongoDB 的 IP 及端口即可,其中第一個(gè)參數(shù)為地址 host,第二個(gè)參數(shù)為端口 port(如果不給它傳遞參數(shù),默認(rèn)是 27017)
import pymongo # 如果是云服務(wù)的數(shù)據(jù)庫(kù) 用公網(wǎng)IP連接 client = pymongo.MongoClient(host='localhost', port=27017)
3. 指定數(shù)據(jù)庫(kù)和表
db = client.test collection = db['students'] # 都可以
4. 插入數(shù)據(jù)
插入數(shù)據(jù)。對(duì)于 students 這個(gè)集合,新建一條學(xué)生數(shù)據(jù),這條數(shù)據(jù)以字典形式表示:
student = {
'id': '20170101',
'name': 'Jordan',
'age': 20,
'gender': 'male'
}
result = collection.insert(student)4.1. 插入多條數(shù)據(jù)
student1 = {
'id': '20170101',
'name': 'Jordan',
'age': 20,
'gender': 'male'
}
student2 = {
'id': '20170202',
'name': 'Mike',
'age': 21,
'gender': 'male'
}
result = collection.insert([student1, student2])
print(result)5. 爬蟲(chóng)數(shù)據(jù)采集入庫(kù)
# encoding: utf-8
import pymongo
client = pymongo.MongoClient(host='localhost', port=27017)
db = client.test
collection = db['students'] # 都可以
import httpx
def get_data():
res = httpx.get('https://careers.tencent.com/tencentcareer/api/post/Query?timestamp=1647605552864&countryId=&cityId=&bgIds=&productId=&categoryId=&parentCategoryId=&attrId=&keyword=python&pageIndex=2&pageSize=10&language=zh-cn&area=cn')
# 數(shù)據(jù)變字典格式
items = res.json()
item = items.get('Data')['Posts'] # 列表形式
for i in item:
if isinstance(i,dict):
collection.insert_one(i)
get_data()到此這篇關(guān)于Python中數(shù)據(jù)的多種存儲(chǔ)形式的文章就介紹到這了,更多相關(guān)Python數(shù)據(jù)存儲(chǔ)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
對(duì)python生成業(yè)務(wù)報(bào)表的實(shí)例詳解
今天小編就為大家分享一篇對(duì)python生成業(yè)務(wù)報(bào)表的實(shí)例詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-02-02
python實(shí)現(xiàn)異步回調(diào)機(jī)制代碼分享
本文介紹了python實(shí)現(xiàn)異步回調(diào)機(jī)制的功能,大家參考使用吧2014-01-01
Python實(shí)現(xiàn)郵件的批量發(fā)送的示例代碼
下面小編就為大家分享一篇Python實(shí)現(xiàn)郵件的批量發(fā)送的示例代碼,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-01-01
Python?pyecharts數(shù)據(jù)可視化實(shí)例詳解
PyEcharts是一個(gè)用于生成?Echarts圖表的類庫(kù),?Python是一門(mén)富有表達(dá)力的語(yǔ)言,很適合用于數(shù)據(jù)處理,下面這篇文章主要給大家介紹了關(guān)于Python?pyecharts數(shù)據(jù)可視化的相關(guān)資料,需要的朋友可以參考下2022-05-05
Selenium基于PIL實(shí)現(xiàn)拼接滾動(dòng)截圖
這篇文章主要介紹了Selenium基于PIL實(shí)現(xiàn)拼接滾動(dòng)截圖,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-04-04
pyqt5讓圖片自適應(yīng)QLabel大小上以及移除已顯示的圖片方法
今天小編就為大家分享一篇pyqt5讓圖片自適應(yīng)QLabel大小上以及移除已顯示的圖片方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-06-06
使用 Django 進(jìn)行測(cè)試驅(qū)動(dòng)開(kāi)發(fā)
本文分享了什么是測(cè)試驅(qū)動(dòng)開(kāi)發(fā),并用測(cè)試驅(qū)動(dòng)開(kāi)發(fā)的方式 創(chuàng)建了一個(gè)簡(jiǎn)單的 Django 應(yīng)用程序,感興趣的可以了解一下2021-11-11
PyQt5 QTableView設(shè)置某一列不可編輯的方法
今天小編就為大家分享一篇PyQt5 QTableView設(shè)置某一列不可編輯的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-06-06
Python的Flask框架中實(shí)現(xiàn)分頁(yè)功能的教程
這篇文章主要介紹了Python的Flask框架中實(shí)現(xiàn)分頁(yè)功能的教程,文中的示例基于一個(gè)博客來(lái)實(shí)現(xiàn),需要的朋友可以參考下2015-04-04

