詳解Python中數(shù)據(jù)的多種存儲形式
1 JSON 文件存儲
JSON,全稱為 JavaScript Object Notation, 也就是 JavaScript 對象標記,它通過對象和數(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" }]
由中括號包圍的就相當于列表類型,列表中的每個元素可以是任意類型,這個示例中它是字典類型,由大括號包圍。
JSON 可以由以上兩種形式自由組合而成,可以無限次嵌套,結(jié)構(gòu)清晰,是數(shù)據(jù)交換的極佳方式。
import json data = [{ 'name': '王偉', 'gender': '男', 'birthday': '1992-10-18' },{ 'name': '張三', 'gender': '男', 'birthday': '1993-10-18' }] # w 寫入 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 必須要雙引號
2 CSV 文件存儲
CSV,全稱為 Comma-Separated Values,中文可以叫作逗號分隔值或字符分隔值,其文件以純文本形式存儲表格數(shù)據(jù)。該文件是一個字符序列,可以由任意數(shù)目的記錄組成,記錄間以某種換行符分隔。每條記錄由字段組成,字段間的分隔符是其他字符或字符串,最常見的是逗號或制表符。不過所有記錄都有完全相同的字段序列,相當于一個結(jié)構(gòu)化表的純文本形式。它比 Excel 文件更加簡潔,XLS 文本是電子表格,它包含了文本、數(shù)值、公式和格式等內(nèi)容,而 CSV 中不包含這些內(nèi)容,就是特定字符分隔的純文本,結(jié)構(gòu)簡單清晰。所以,有時候用 CSV 來保存數(shù)據(jù)是比較方便的。本節(jié)中,我們來講解 Python 讀取和寫入 CSV 文件的過程。
1. 寫入
這里先看一個最簡單的例子:
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])
首先,打開 data.csv 文件,然后指定打開的模式為 w(即寫入),獲得文件句柄,隨后調(diào)用 csv 庫的 writer 方法初始化寫入對象,傳入該句柄,然后調(diào)用 writerow 方法傳入每行的數(shù)據(jù)即可完成寫入。
如果想修改列與列之間的分隔符,可以傳入 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.多行寫入
調(diào)用 writerows
方法同時寫入多行,此時參數(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.字典寫入
用字典來表示。在 csv 庫中也提供了字典的寫入方式,示例如下:
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. 爬蟲采集入庫
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ù)庫存儲
關(guān)系型數(shù)據(jù)庫是基于關(guān)系模型的數(shù)據(jù)庫,而關(guān)系模型是通過二維表來保存的,所以它的存儲方式就是行列組成的表,每一列是一個字段,每一行是一條記錄。表可以看作某個實體的集合,而實體之間存在聯(lián)系,這就需要表與表之間的關(guān)聯(lián)關(guān)系來體現(xiàn),如主鍵外鍵的關(guān)聯(lián)關(guān)系。多個表組成一個數(shù)據(jù)庫,也就是關(guān)系型數(shù)據(jù)庫。
關(guān)系型數(shù)據(jù)庫有多種,如 SQLite、MySQL、Oracle、SQL Server、DB2 等。
1. 準備工作
在開始之前,請確保已經(jīng)安裝好了 MySQL 數(shù)據(jù)庫并保證它能正常運行,而且需要安裝好 Py MySQL 庫。如果沒有安裝找班主任老師拿包
下載地址;https://dev.mysql.com/downloads/mysql/
安裝包:https://downloads.mysql.com/archives/get/p/23/file/mysql-5.7.9-winx64.zip
參考地址:http://www.dbjr.com.cn/article/265139.htm
2. 連接數(shù)據(jù)庫
這里,首先嘗試連接一下數(shù)據(jù)庫。假設(shè)當前的 MySQL 運行在本地,用戶名為 root,密碼為 123456,運行端口為 3306。這里利用 PyMySQL 先連接 MySQL,然后創(chuàng)建一個新的數(shù)據(jù)庫,名字叫作 spiders,代碼如下:
import pymysql db = pymysql.connect(host='localhost',user='root', password='123456', port=3306) cursor = db.cursor() # 游標 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ù)
插入、更新和刪除操作都是對數(shù)據(jù)庫進行更改的操作,而更改操作都必須為一個事務(wù),所以這些操作的標準寫法就是:
import pymysql id = '20220315' user = '菲菲' age = 20 db = pymysql.connect(host='localhost', user='root', password='123456', port=3306, db='spiders') cursor = db.cursor() # %s 動態(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. 爬蟲數(shù)據(jù)采集入庫
4 非關(guān)系型數(shù)據(jù)庫存儲
1. MongoDB簡介
MongoDB 是由 C++ 語言編寫的非關(guān)系型數(shù)據(jù)庫,是一個基于分布式文件存儲的開源數(shù)據(jù)庫系統(tǒng),其內(nèi)容存儲形式類似 JSON 對象,它的字段值可以包含其他文檔、數(shù)組及文檔數(shù)組,非常靈活。在這一節(jié)中,我們就來看看 Python 3 下 MongoDB 的存儲操作。
安裝地址
參考:https://www.runoob.com/mongodb/mongodb-linux-install.html
2. 連接 MongoDB
連接 MongoDB 時,我們需要使用 PyMongo 庫里面的 MongoClient。一般來說,傳入 MongoDB 的 IP 及端口即可,其中第一個參數(shù)為地址 host,第二個參數(shù)為端口 port(如果不給它傳遞參數(shù),默認是 27017)
import pymongo # 如果是云服務(wù)的數(shù)據(jù)庫 用公網(wǎng)IP連接 client = pymongo.MongoClient(host='localhost', port=27017)
3. 指定數(shù)據(jù)庫和表
db = client.test collection = db['students'] # 都可以
4. 插入數(shù)據(jù)
插入數(shù)據(jù)。對于 students 這個集合,新建一條學(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. 爬蟲數(shù)據(jù)采集入庫
# 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ù)的多種存儲形式的文章就介紹到這了,更多相關(guān)Python數(shù)據(jù)存儲內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python實現(xiàn)異步回調(diào)機制代碼分享
本文介紹了python實現(xiàn)異步回調(diào)機制的功能,大家參考使用吧2014-01-01Python實現(xiàn)郵件的批量發(fā)送的示例代碼
下面小編就為大家分享一篇Python實現(xiàn)郵件的批量發(fā)送的示例代碼,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-01-01Python?pyecharts數(shù)據(jù)可視化實例詳解
PyEcharts是一個用于生成?Echarts圖表的類庫,?Python是一門富有表達力的語言,很適合用于數(shù)據(jù)處理,下面這篇文章主要給大家介紹了關(guān)于Python?pyecharts數(shù)據(jù)可視化的相關(guān)資料,需要的朋友可以參考下2022-05-05pyqt5讓圖片自適應(yīng)QLabel大小上以及移除已顯示的圖片方法
今天小編就為大家分享一篇pyqt5讓圖片自適應(yīng)QLabel大小上以及移除已顯示的圖片方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-06-06PyQt5 QTableView設(shè)置某一列不可編輯的方法
今天小編就為大家分享一篇PyQt5 QTableView設(shè)置某一列不可編輯的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-06-06Python的Flask框架中實現(xiàn)分頁功能的教程
這篇文章主要介紹了Python的Flask框架中實現(xiàn)分頁功能的教程,文中的示例基于一個博客來實現(xiàn),需要的朋友可以參考下2015-04-04