久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

幾種Python 數(shù)據(jù)讀寫方式,面向Txt,、csv文檔及MongoDB,、MySQL等數(shù)據(jù)庫

 西北望msm66g9f 2021-08-10

1. 前言

Hello,大家好,,我是小張~

在日常與 Python 打交道過程中,,不可避免會(huì)涉及到數(shù)據(jù)讀寫業(yè)務(wù),例如做爬蟲時(shí),,需要將爬取的數(shù)據(jù)首先存儲(chǔ)到本地然后再做下一步處理,;做數(shù)據(jù)可視化分析時(shí),需要將數(shù)據(jù)從硬盤中讀入內(nèi)存上,,再進(jìn)行后續(xù)的數(shù)據(jù)清洗,、可視化、建模等步驟

對數(shù)據(jù)進(jìn)行讀寫操作時(shí),,對于存儲(chǔ)對象我們有多種選擇,,最方便的是本地文檔類型:csv,、txt 等,,優(yōu)點(diǎn)是方便簡單、但弊端也很明顯:文檔型數(shù)據(jù)易丟失,、損壞,,刪除不可恢復(fù),且不方便多人間數(shù)據(jù)共享,;

另一大類存儲(chǔ)對象為數(shù)據(jù)庫,,目前比較流性的持久化數(shù)據(jù)庫為 MongoDB 和Mysql ;對比文檔存儲(chǔ),,數(shù)據(jù)庫最大的優(yōu)勢就是:數(shù)據(jù)不易丟失且易檢索,,面對龐大數(shù)據(jù)量僅幾行 SQL  語句即可實(shí)現(xiàn) CRUD(增、讀、改,、刪) 功能

在本期 Python 教程中,,將匯總一下有關(guān) Python 數(shù)據(jù)讀寫方式,涉及到的存儲(chǔ)對象有四類:txt,、csv,、MongoDV以及MySQL

2. Python 文檔讀寫

關(guān)于本地文檔數(shù)據(jù)讀寫,本文列出兩類常見文檔類型:txt 及 csv ,;測試數(shù)據(jù)來源于鏈家二手房房源,,關(guān)于房源數(shù)據(jù)爬取詳情參考舊聞 Python 采集了3000 條北京二手房數(shù)據(jù),看看我都分析出來了啥,?

2.1 txt 讀寫

在本文介紹的幾種數(shù)據(jù)存儲(chǔ)對象中,,txt 讀寫是最簡單的一種,關(guān)于讀寫方式這里我就不作詳細(xì)介紹了,,不太了解的小伙伴可以參考下方測試代碼:

# txt 數(shù)據(jù)源,,需記得加上 encoding='utf-8' 參數(shù),防止亂碼
dataSource = open('data.txt',encoding='utf-8',mode='r')

# txt 數(shù)據(jù)讀寫操作
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 讀寫整個(gè)流程都是借助文件流方式完成的,,需要注意的是在讀寫過程中若出現(xiàn)中文亂碼情況,,需要加上參數(shù)encoding = 'utf-8' 即可有效避免:

2.2 csv 讀寫

與 txt 相比 ,Python愛好者更偏愛把數(shù)據(jù)存入 csv 或 xlsx,,后者相對更為規(guī)范,,尤其是面向數(shù)值數(shù)據(jù),對于編程基礎(chǔ)并不好的同學(xué),,不需要 Python 借助 Excel 可以直接進(jìn)行可視化分析,;

csv 在 Python 中有多種讀寫方式,下面實(shí)例中我列出其中常見的兩種,,一種是基于 python-csv ,、另一種是基于pandas

csv 數(shù)據(jù)讀取

讀取測試時(shí),是從 csv 中讀入數(shù)據(jù)

方法一,,借助python-csv 讀取

# 利用 python-csv 實(shí)現(xiàn)數(shù)據(jù)讀取
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 數(shù)據(jù)寫入

方法一,借助 python-csv

# txt 數(shù)據(jù)源,,需記得加上 encoding='utf-8' 參數(shù),,防止亂碼
dataSource = open('data.txt',encoding='utf-8',mode='r')
# 利用 python-csv 實(shí)現(xiàn) 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 實(shí)現(xiàn) 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)

關(guān)于用 Python 操作 csv 文件,,個(gè)人更喜歡用 pandas 來處理,,在 pandas 中數(shù)據(jù)皆以 DataFrameSeries 類型展示,對于大部分?jǐn)?shù)值計(jì)算或統(tǒng)計(jì)分析方法都有封裝好的函數(shù),,直接調(diào)用即可,,非常方便

關(guān)于 pandas 的基礎(chǔ)使用,,詳情可參考舊文:

3 Python 數(shù)據(jù)庫讀寫

介紹完 Python 在本地文檔中的讀寫方式,,下面將介紹一下 Python 在數(shù)據(jù)庫中的處理;這里我選擇了 MongoDB 和 MySQL 兩個(gè)比較流行的數(shù)據(jù)庫,;在正式介紹之前請確保大家的環(huán)境已經(jīng)配好

3.1 MongoDB 數(shù)據(jù)讀寫

Mongodb 是一類面向文檔型數(shù)據(jù)庫,,屬于 NoSQL 陣營,也就是常說的非關(guān)系型數(shù)據(jù)庫,,

存儲(chǔ)時(shí)將數(shù)據(jù)接受由 鍵值對 (key=> value) 組成,,類似于 JSON 對象;也就是說 Python 與 Mongodb 數(shù)據(jù)交互時(shí),,需要以字典形式傳遞

那如何用Python來連接 MongoDB 呢,?這個(gè)不需要我們擔(dān)心,Python 最大的優(yōu)勢就可以依賴龐大的第三方庫 ,,借助 pymongo 可幫我們對 MongoDB 中的數(shù)據(jù)實(shí)現(xiàn) CRUD 業(yè)務(wù)操作

MongoDB 連接初始化

本地端 MongoDB 下載完成之后,,數(shù)據(jù)庫默認(rèn)端口為 127017  ,主機(jī)地址為 loclhost,,在進(jìn)行數(shù)據(jù)讀寫之前,,需要對數(shù)據(jù)庫完成初始化連接,代碼如下

import pymongo
# 連接數(shù)據(jù)庫,,創(chuàng)建數(shù)據(jù)表
myclient = pymongo.MongoClient('mongodb://localhost:27017')
database = myclient['database']# 連接接數(shù)據(jù)庫
collection = database['table']# collection 類似于Mysql中的 table

代碼中 'database' ,、'table' 分別表示數(shù)據(jù)庫名、表名,,在數(shù)據(jù)寫入時(shí)若不存在對應(yīng)數(shù)據(jù)庫或數(shù)據(jù)表,,MongoDB 會(huì)自動(dòng)創(chuàng)建

MongoDB 數(shù)據(jù)寫入

之前在介紹 MongoDB 時(shí),提到它的數(shù)據(jù)結(jié)構(gòu)由鍵值對組成,,類似于 JSON 對象,;因此在數(shù)據(jù)插入步驟中,需將數(shù)據(jù)轉(zhuǎn)化為字典形式(列名作為 key,,列值作為 value),,數(shù)據(jù)樣式如下:

數(shù)據(jù)寫入 Python 代碼實(shí)現(xiàn)

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(',')
    # 數(shù)據(jù)字典格式化
    dataDict = dict(zip(keys_list, dataList))
    if collection.find_one(dataDict):# 插入前判斷數(shù)據(jù)表中是否存在該數(shù)據(jù)記錄;
        print('Insert done......')
    else:# 不存在時(shí)插入
        collection.insert_one(dataDict)

數(shù)據(jù)寫入后效果如下,,這里 GUI 工具用的是官方提供的 mongo compass

pymongo 數(shù)據(jù)插入可通過兩種方式完成

  • insert_one()每次插入一條數(shù)據(jù),;
  • insert_many() 每次插入多條數(shù)據(jù),插入多條數(shù)據(jù)需要以列表形式存儲(chǔ),;

MongoDB 數(shù)據(jù)讀取

MongoDB 數(shù)據(jù)讀取,可以理解為無條件查詢,,通過 find() 返回 一個(gè) Cursor 對象,;Cursor 中文意思就是游標(biāo),,與迭代器特性相似,可通過迭代方式依次返回?cái)?shù)據(jù)庫數(shù)據(jù)

數(shù)據(jù)讀取方式如下:

myclient = pymongo.MongoClient('mongodb://localhost:27017')
database = myclient['database']
collection = database['table']
for post_data in collection.find():
    print(post_data)

除了無條件查詢外,,可以加入一些篩選條件,,如下:

  • 查詢時(shí),只返回前10條數(shù)據(jù)
for post_data in collection.find()[:10]:
    print(post_data)
  • 查詢時(shí),,需以某個(gè)字段值以逆序方式返回,,例如 _id 字段
for post_data in collection.find().sort('_id',pymongo.ASCENDING):
    print(post_data)
  • 只返回 community西宏苑 的數(shù)據(jù)
for post_data in collection.find({'community':'西宏苑'}):
    print(post_data)

關(guān)于如何用 pymongo 操作 MongoDB, 還有許多實(shí)用方法,,這里我只介紹了其中一小部分,,詳情可參考 pymongo 官方文檔:

https://pymongo./en/stable/api/pymongo/collection.html

3.2  MySQL 讀寫

MySQL屬于典型的關(guān)系型數(shù)據(jù)庫,數(shù)據(jù)表間可以通過外鍵銜接,,這樣當(dāng)一個(gè)字段在某個(gè)表中得到更新,,其它相關(guān)聯(lián)數(shù)據(jù)表中也會(huì)進(jìn)行自動(dòng)更新,數(shù)據(jù)增刪改查業(yè)務(wù)邏輯主要通過 SQL 語句完成,,

python 操控 MySQL 目前有兩類庫可以使用,,MySQLdb 和 pymysql ,兩個(gè)庫操作mysql 方法相似,,核心功能都是依賴于 sql 語句,,可以認(rèn)為提供了一個(gè)Python 與 MySQL  連接的接口,

在本文中選擇 pymysql 作 為測試庫,,用 pymysql 進(jìn)行讀寫之前,,建議通過命令行測試一下本機(jī)上 MySQL 數(shù)據(jù)庫是否可用,測試方法如下:

MySQL 連接初始化

pymysql 連接 MySQL 時(shí)需要配置 ip,、端口,、用戶名、密碼,、及數(shù)據(jù)庫名稱(與 MongoDB 不同的是,,MySQL 數(shù)據(jù)庫需要提前創(chuàng)建好)

import pymysql
db_conn = pymysql.connect(host= '127.0.0.1', port= 3306, user= 'root', password= '123456', db= 'db_example')

MySQL數(shù)據(jù)插入

向 MySQL 中插入數(shù)據(jù)時(shí),可以新建一個(gè)表,,也可以基于原有數(shù)據(jù)庫中的表進(jìn)行插入,,在下面測試代碼中我采用的是前者

# 創(chuàng)建 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 數(shù)據(jù)插入代碼

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)
    # 執(zhí)行sql 語句
    with db_conn.cursor() as cursor:
        cursor.execute(insert_sql)

# 關(guān)閉數(shù)據(jù)庫
db_conn.close()

數(shù)據(jù)插入效果如下,下面是用 Navicat作為 mysql 的UI界面:

從上面代碼塊可以了解到,,在pymysql 連接 MySQL 并將數(shù)據(jù)插入步驟中,,業(yè)務(wù)功能主要是依賴于 SQL 語句,也就是說想要用 python 操作 MySQL 的話,,需要提前掌握一下 SQL 語句

INSERT data_table (title,community,citydirct,houseinfo,dateinfo,taglist,totalprice,unitprice) VALUES ' + \
                 '
('' + '',''.join(dataList) + '')

pymysql 操作 MySQL 需要注意的是,,每執(zhí)行完 一條或多條 sql 語句時(shí),需要 commit() 一下,,否則執(zhí)行無效

cursor.execute(sql2,'data_table')
db_conn.commit()

MySQL數(shù)據(jù)查詢

通過 SELECT * FROM data_table 語句即可查詢到數(shù)據(jù)表 data_table 中的所有數(shù)據(jù):

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

除了無條件查詢外,,當(dāng)然也可以通過SELECT * FROM data_table where .... 語句來實(shí)現(xiàn)條件查詢,, ... 代表需要添加的條件語句

除了基本讀寫之外,借助 sql 語句也可以做一些更新,、刪除等業(yè)務(wù)功能,;麻煩一點(diǎn)的就是,用 Python 拼接 sql 語句時(shí)會(huì)容易出現(xiàn)語法錯(cuò)誤,,這一點(diǎn)遠(yuǎn)不如 Java,,

在 Java 中有封裝好的 jar 包,對一些常見的增刪改查業(yè)務(wù)只需要傳入?yún)?shù),,不需要關(guān)心 sql 語句是否合法,,非常方便! 與 Java 相比,,Python 與 MySQL 交互操作還有很大的改進(jìn)空間 ~

小結(jié)

本文分別介紹了Python 面向四類存儲(chǔ)對象的讀寫方式,,分為文檔和數(shù)據(jù)庫兩大類,從 txt 到 csv,,從MongoDB 到 MySQL,,涵蓋日常生活中的大部分業(yè)務(wù)場景;對于大部分學(xué)習(xí)Python的小伙伴,,為了便捷性,,用 Python 處理數(shù)據(jù)時(shí)都會(huì)首選 txt、csv  等文檔作為存儲(chǔ)對象,;

但是一旦數(shù)據(jù)量變得龐大,,或者存儲(chǔ)數(shù)據(jù)的文檔很多時(shí),文檔對象存儲(chǔ)的弊端就會(huì)顯露出來:文檔數(shù)據(jù)易被誤刪,、數(shù)據(jù)間關(guān)系容易混淆,,文檔亂放等問題;此時(shí)數(shù)據(jù)庫的優(yōu)勢就能顯露出來:

1,,龐大的數(shù)據(jù)存儲(chǔ)量,,在MySQL3.22 版本中 單表最大存儲(chǔ)空間為 4GB ,一個(gè)數(shù)據(jù)庫可以創(chuàng)建多個(gè)數(shù)據(jù)表,,MySQL 也可以創(chuàng)建多個(gè)數(shù)據(jù)庫,,如下圖所示

2,數(shù)據(jù)表間關(guān)系清晰,,容易快速檢索,;一個(gè)數(shù)據(jù)庫就可以把多個(gè)數(shù)據(jù)表匯聚到一處,方便查找,;伴隨數(shù)據(jù)量增加,,還可以根據(jù)屬性、使用場景將數(shù)據(jù)劃分為多個(gè)數(shù)據(jù)庫進(jìn)行存儲(chǔ),;

3,,數(shù)據(jù)庫中數(shù)據(jù)如果誤刪的話還可通過技術(shù)手段恢復(fù),,因此了解數(shù)據(jù)庫數(shù)據(jù)基本操作方式還是很有必要的,!

好了,,關(guān)于Python 數(shù)據(jù)存儲(chǔ)就介紹到這里了,如果內(nèi)容對你有幫助的話不妨點(diǎn)個(gè)贊來鼓勵(lì)一下我~

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

小張Python
小張Python
分享一些小案例來學(xué) Python,;爬蟲、小游戲,、GUI,、Web開發(fā)都有涉獵!
85篇原創(chuàng)內(nèi)容
公眾號(hào)

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,,所有內(nèi)容均由用戶發(fā)布,,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式,、誘導(dǎo)購買等信息,,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,,請點(diǎn)擊一鍵舉報(bào),。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多