1. 程式人生 > 其它 >詳講 Python 資料讀寫方式,面向Excel、Txt文件及Mongodb、MySQL等資料庫

詳講 Python 資料讀寫方式,面向Excel、Txt文件及Mongodb、MySQL等資料庫

1. 前言

Hello,大家好,我是小張~

在日常與 Python 打交道過程中,不可避免會涉及到資料讀寫業務,例如做爬蟲時,需要將爬取的資料首先儲存到本地然後再做下一步處理;做資料視覺化分析時,需要將資料從硬碟中讀入記憶體上,再進行後續的資料清洗、視覺化、建模等步驟

對資料進行讀寫操作時,對於儲存物件我們有多種選擇,最方便的是本地文件型別:csv、txt 等,優點是方便簡單、但弊端也很明顯:文件型資料易丟失、損壞,刪除不可恢復,且不方便多人間資料共享;

另一大類儲存物件為資料庫,目前比較流性的持久化資料庫為 MongoDB 和Mysql ;對比文件儲存,資料庫最大的優勢就是:資料不易丟失且易檢索,面對龐大資料量僅幾行 sql

語句即可實現 CRUD(增、讀、改、刪) 功能

在本期 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 中資料皆以 DataFrameSeries 型別展示,對於大部分數值計算或統計分析方法都有封裝好的函式,直接呼叫即可,非常方便

關於 pandas 的基礎使用,詳情可參考舊文:

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 資料儲存就介紹到這裡了,如果內容對你有幫助的話不妨點個贊來鼓勵一下我~

最後感謝大家的閱讀,我們下期見 !