詳講 Python 資料讀寫方式,面向Excel、Txt文件及Mongodb、MySQL等資料庫
1. 前言
Hello,大家好,我是小張~
在日常與 Python 打交道過程中,不可避免會涉及到資料讀寫業務,例如做爬蟲時,需要將爬取的資料首先儲存到本地然後再做下一步處理;做資料視覺化分析時,需要將資料從硬碟中讀入記憶體上,再進行後續的資料清洗、視覺化、建模等步驟
對資料進行讀寫操作時,對於儲存物件我們有多種選擇,最方便的是本地文件型別:csv、txt 等,優點是方便簡單、但弊端也很明顯:文件型資料易丟失、損壞,刪除不可恢復,且不方便多人間資料共享;
另一大類儲存物件為資料庫,目前比較流性的持久化資料庫為 MongoDB 和Mysql ;對比文件儲存,資料庫最大的優勢就是:資料不易丟失且易檢索,面對龐大資料量僅幾行 sql
在本期 Python 教程中,將彙總一下有關 Python 資料讀寫方式,涉及到的儲存物件有四類:txt、csv、MongoDV以及MySQL
2. Python 文件讀寫
關於本地文件資料讀寫,本文列出兩類常見文件型別: txt 及 csv ;測試資料來源於鏈家二手房房源,關於房源資料爬取詳情參考舊聞 Python 採集了3000 條北京二手房資料,看看我都分析出來了啥?
2.1 txt 讀寫
在本文介紹的幾種資料儲存物件中,txt 讀寫是最簡單的一種,關於讀寫方式這裡我就不作詳細介紹了,不太瞭解的小夥伴可以參考下方測試程式碼:
# txt 資料來源,需記得加上 encoding='utf-8' 引數,防止亂碼 dataSource = open('data.txt',encoding='utf-8',mode='r') # txt 資料讀寫操作 savePath = 'save.txt' f = open(savePath,encoding='utf-8',mode='w+')# 讀取 for lineData in dataSource.readlines(): dataList = lineData.replace('\n','').split(',') print(dataList) f.write('\t'.join(dataList) +'\n') f.close()
txt 讀寫整個流程都是藉助檔案流方式完成的,需要注意的是在讀寫過程中若出現中文亂碼情況,需要加上引數encoding = 'utf-8'
即可有效避免:
2.2 csv 讀寫
與 txt 相比 ,Python愛好者更偏愛把資料存入 csv 或 xlsx,後者相對更為規範,尤其是面向數值資料,對於程式設計基礎並不好的同學,不需要 Python 藉助 Excel 可以直接進行視覺化分析;
csv 在 Python 中有多種讀寫方式,下面例項中我列出其中常見的兩種,一種是基於 python-csv
、另一種是基於pandas
csv 資料讀取
讀取測試時,是從 csv 中讀入資料
方法一,藉助python-csv
# 利用 python-csv 實現資料讀取
csvPath = 'save.csv'
with open(csvPath, newline='',encoding='utf-8') as csvfile:
spamreader = csv.reader(csvfile, delimiter=',', quotechar='|')
for row in spamreader:
print(', '.join(row))
方法二,藉助 pandas
讀取
csvPath = 'save.csv'
df = pandas.read_csv(csvPath,header=0)
print(df)
csv 資料寫入
方法一,藉助 python-csv
# txt 資料來源,需記得加上 encoding='utf-8' 引數,防止亂碼
dataSource = open('data.txt',encoding='utf-8',mode='r')
# 利用 python-csv 實現 csv 檔案寫入
csvPath = 'save.csv'
with open(csvPath, 'w', newline='',encoding='utf-8') as csvfile:
spamwriter = csv.writer(csvfile, delimiter=' ',
quotechar='|', quoting=csv.QUOTE_MINIMAL)
for index, lineData in enumerate(dataSource.readlines()):
dataList = lineData.replace('\n', '').split(',')
spamwriter.writerow(dataList)
方法二,藉助pandas
dataSource = open('data.txt',encoding='utf-8',mode='r')
# 利用 pandas 實現 csv 檔案寫入
csvPath = 'save.csv'
data = []
columnName = []
for index,lineData in enumerate(dataSource.readlines()):
if(index==0):# 第一行作為列名
columnName = lineData.replace('\n','').split(',')
continue
dataList = lineData.replace('\n','').split(',')
data.append(dataList)
df =pandas.DataFrame(data,columns =columnName)
# 防止亂碼
df.to_csv(csvPath,encoding="utf_8_sig",index=False)
關於用 Python 操作 csv 檔案,個人更喜歡用 pandas 來處理,在 pandas 中資料皆以 DataFrame
或 Series
型別展示,對於大部分數值計算或統計分析方法都有封裝好的函式,直接呼叫即可,非常方便
關於 pandas 的基礎使用,詳情可參考舊文:
- Pandas 資料處理(一) —— 幾個簡單函式掌握!
- Pandas 資料處理(二) —— 條件篩選與排序!
- Pandas資料處理(三) — 分組聚類(groupby)
- Pandas資料處理|apply()函式的常規用法
- Pandas 基本使用— DataFrame.to_dict() 函式使用
3 Python 資料庫讀寫
介紹完 Python 在本地文件中的讀寫方式,下面將介紹一下 Python 在資料庫中的處理;這裡我選擇了 MongoDB 和 MySQL 兩個比較流行的資料庫;在正式介紹之前請確保大家的環境已經配好
3.1 MongoDB 資料讀寫
Mongodb 是一類面向文件型資料庫,屬於 NoSQL 陣營,也就是常說的非關係型資料庫,
儲存時將資料接受由 鍵值對 (key=> value) 組成,類似於 JSON 物件;也就是說 Python 與 Mongodb 資料互動時,需要以字典形式傳遞
那如何用Python來連線 MongoDB 呢?這個不需要我們擔心,Python 最大的優勢就可以依賴龐大的第三方庫 ,藉助 pymongo
可幫我們對 MongoDB 中的資料實現 CRUD 業務操作
MongoDB 連線初始化
本地端 MongoDB 下載完成之後,資料庫預設埠為 127017
,主機地址為 loclhost
,在進行資料讀寫之前,需要對資料庫完成初始化連線,程式碼如下
import pymongo
# 連線資料庫,建立資料表
myclient = pymongo.MongoClient("mongodb://localhost:27017")
database = myclient["database"]# 連線接資料庫
collection = database["table"]# collection 類似於Mysql中的 table
程式碼中 "database"
、"table"
分別表示資料庫名、表名,在資料寫入時若不存在對應資料庫或資料表,MongoDB 會自動建立
MongoDB 資料寫入
之前在介紹 MongoDB 時,提到它的資料結構由鍵值對組成,類似於 JSON 物件;因此在資料插入步驟中,需將資料轉化為字典形式(列名作為 key,列值作為 value),資料樣式如下:
資料寫入 Python 程式碼實現
dataSource = open('data.txt',encoding='utf-8',mode='r')
readlines = dataSource.readlines()
keys_list = readlines[0].replace('\n', '').split(',')
for lineData in readlines[1:]:
dataList = lineData.replace('\n', '').split(',')
# 資料字典格式化
dataDict = dict(zip(keys_list, dataList))
if collection.find_one(dataDict):# 插入前判斷資料表中是否存在該資料記錄;
print("Insert done......")
else:# 不存在時插入
collection.insert_one(dataDict)
資料寫入後效果如下,這裡 GUI 工具用的是官方提供的 mongo compass
pymongo 資料插入可通過兩種方式完成
insert_one()
每次插入一條資料;insert_many()
每次插入多條資料,插入多條資料需要以列表形式儲存;
MongoDB 資料讀取
MongoDB 資料讀取,可以理解為無條件查詢,通過 find()
返回 一個 Cursor
物件;Cursor 中文意思就是遊標,與迭代器特性相似,可通過迭代方式依次返回資料庫資料
資料讀取方式如下:
myclient = pymongo.MongoClient("mongodb://localhost:27017")
database = myclient["database"]
collection = database["table"]
for post_data in collection.find():
print(post_data)
除了無條件查詢外,可以加入一些篩選條件,如下:
- 查詢時,只返回前10條資料
for post_data in collection.find()[:10]:
print(post_data)
- 查詢時,需以某個欄位值以逆序方式返回,例如
_id
欄位
for post_data in collection.find().sort('_id',pymongo.ASCENDING):
print(post_data)
- 只返回
community
為西巨集苑
的資料
for post_data in collection.find({"community":"西巨集苑"}):
print(post_data)
關於如何用 pymongo 操作 MongoDB, 還有許多實用方法,這裡我只介紹了其中一小部分,詳情可參考 pymongo 官方文件:
https://pymongo.readthedocs.io/en/stable/api/pymongo/collection.html
3.2 MySQL 讀寫
MySQL屬於典型的關係型資料庫,資料表間可以通過外來鍵銜接,這樣當一個欄位在某個表中得到更新,其它相關聯資料表中也會進行自動更新,資料增刪改查業務邏輯主要通過 SQL 語句完成,
python 操控 MySQL 目前有兩類庫可以使用,MySQLdb 和 pymysql ,兩個庫操作mysql 方法相似,核心功能都是依賴於 sql 語句,可以認為提供了一個Python 與 MySQL 連線的介面,
在本文中選擇 pymysql 作 為測試庫,用 pymysql 進行讀寫之前,建議通過命令列測試一下本機上 MySQL 資料庫是否可用,測試方法如下:
MySQL 連線初始化
pymysql 連線 MySQL 時需要配置 ip、埠、使用者名稱、密碼、及資料庫名稱(與 MongoDB 不同的是,MySQL 資料庫需要提前建立好)
import pymysql
db_conn = pymysql.connect(host= '127.0.0.1', port= 3306, user= 'root', password= '123456', db= 'db_example')
MySQL資料插入
向 MySQL 中插入資料時,可以新建一個表,也可以基於原有資料庫中的表進行插入,在下面測試程式碼中我採用的是前者
# 建立 table data_table
sql1 = " drop table if exists %s;"
sql2 ='''CREATE TABLE %s (
title varchar(1000),
community varchar(1000),
citydirct varchar(1000),
houseinfo varchar(1000),
dateinfo varchar(1000),
taglist varchar(1000),
totalprice varchar(1000),
unitprice varchar(1000)
)
'''
try:
with db_conn.cursor() as cursor:
cursor.execute(sql1,"data_table")
cursor.execute(sql2,"data_table")
db_conn.commit()
except Exception as e:
db_conn.rollback()
MySQL 資料插入程式碼
for lineData in dataSource.readlines()[1:]:
dataList = lineData.replace('\n', '').split(',')
# 拼接 sql 插入語句
insert_sql = 'INSERT data_table (title,community,citydirct,houseinfo,dateinfo,taglist,totalprice,unitprice) VALUES ' + \
'("' + '","'.join(dataList) + '")'
print(insert_sql)
# 執行sql 語句
with db_conn.cursor() as cursor:
cursor.execute(insert_sql)
# 關閉資料庫
db_conn.close()
資料插入效果如下,下面是用 Navicat作為 mysql 的UI介面:
從上面程式碼塊可以瞭解到,在pymysql 連線 MySQL 並將資料插入步驟中,業務功能主要是依賴於 sql 語句,也就是說想要用 python 操作 MySQL 的話,需要提前掌握一下 SQL 語句
INSERT data_table (title,community,citydirct,houseinfo,dateinfo,taglist,totalprice,unitprice) VALUES ' + \
'("' + '","'.join(dataList) + '")
pymysql 操作 MySQL 需要注意的是,每執行完 一條或多條 sql 語句時,需要 commit()
一下,否則執行無效
cursor.execute(sql2,"data_table")
db_conn.commit()
MySQL資料查詢
通過 SELECT * FROM data_table
語句即可查詢到資料表 data_table 中的所有資料:
import pymysql
db_conn = pymysql.connect(host= 'localhost',
port=3308,
user= 'root',
password= '123456',
db= 'db_example',
charset='utf8mb4')
findSql = 'SELECT * FROM data_table'
try:
with db_conn.cursor() as cursor:
cursor.execute(findSql)
db_conn.commit()
results = cursor.fetchall()
for itemData in results:
print(itemData)
except Exception as e:
db_conn.rollback()
除了無條件查詢外,當然也可以通過SELECT * FROM data_table where ....
語句來實現條件查詢, ...
代表需要新增的條件語句
除了基本讀寫之外,藉助 sql 語句也可以做一些更新、刪除等業務功能;麻煩一點的就是,用 Python 拼接 sql 語句時會容易出現語法錯誤,這一點遠不如 Java,
在 Java 中有封裝好的 jar 包,對一些常見的增刪改查業務只需要傳入引數,不需要關心 sql 語句是否合法,非常方便! 與 Java 相比,Python 與 MySQL 互動操作還有很大的改進空間 ~
小結
本文分別介紹了Python 面向四類儲存物件的讀寫方式,分為文件和資料庫兩大類,從 txt 到 csv,從MongoDB 到 MySQL,涵蓋日常生活中的大部分業務場景;對於大部分學習Python的小夥伴,為了便捷性,用 Python 處理資料時都會首選 txt、csv 等文件作為儲存物件;
但是一旦資料量變得龐大,或者儲存資料的文件很多時,文件物件儲存的弊端就會顯露出來:文件資料易被誤刪、資料間關係容易混淆,文件亂放等問題;此時資料庫的優勢就能顯露出來:
1,龐大的資料儲存量,在MySQL3.22 版本中 單表最大儲存空間為 4GB ,一個數據庫可以建立多個數據表,MySQL 也可以建立多個數據庫,如下圖所示
2,資料表間關係清晰,容易快速檢索;一個數據庫就可以把多個數據表匯聚到一處,方便查詢;伴隨資料量增加,還可以根據屬性、使用場景將資料劃分為多個數據庫進行儲存;
3,資料庫中資料如果誤刪的話還可通過技術手段恢復,因此瞭解資料庫資料基本操作方式還是很有必要的!
好了,關於Python 資料儲存就介紹到這裡了,如果內容對你有幫助的話不妨點個贊來鼓勵一下我~
最後感謝大家的閱讀,我們下期見 !