Python 文件數(shù)據(jù)讀寫的具體實(shí)現(xiàn)
文件數(shù)據(jù)讀寫
讀寫文件,本質(zhì)上是請(qǐng)求操作系統(tǒng)打開一個(gè)文件對(duì)象,然后,通過操作系統(tǒng)提供的接口從這個(gè)文件對(duì)象中讀取數(shù)據(jù)(讀文件),或者把數(shù)據(jù)寫入這個(gè)文件對(duì)象(寫文件)。
文件讀取
使用 Python 內(nèi)置 open() 函數(shù),以 rt 的模式讀取文件,如下示例:
>>> f = open('some.txt', 'rt')
這行代碼就表示打開一個(gè)文件,若是文件不存在,會(huì)拋出 IOError 的異常,并給出詳細(xì)的信息提示:
>>> f = open('undefined.txt', 'rt')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
FileNotFoundError: [Errno 2] No such file or directory: 'undefined.txt'
當(dāng)成功打開文件時(shí),可使用 read() 函數(shù)讀取文件的內(nèi)容:
>>> f.read() 'Hello world!'
當(dāng)數(shù)據(jù)讀取完畢后,需要調(diào)用 close() 關(guān)閉文件。因?yàn)槲募?duì)象會(huì)占用資源,使用完畢后需要及時(shí)關(guān)閉釋放資源。
>>> f.close()
還有一種方法就是使用 with 語(yǔ)句,給被使用的文件創(chuàng)建一個(gè)上下文環(huán)境,這樣文件對(duì)象就能夠自動(dòng)關(guān)閉。
>>> with open('some.txt', 'rt') as f:
... data = f.read()
...
調(diào)用 read() 時(shí)一次性讀取全部?jī)?nèi)容,若是文件內(nèi)容過大,可以使用 read(size) 固定大小循環(huán)讀取,每次最多讀取 size 字節(jié)的內(nèi)容。readline() 函數(shù),每次讀取一行內(nèi)容,readlines() 讀取所有內(nèi)容,但是按行返回 list。三者的使用,可根據(jù)實(shí)際的需求進(jìn)行選擇。
二進(jìn)制文件
讀取二進(jìn)制的文件,需要使用 rb 的模式打開:
>>> f = open('image.jpg', 'rb')
>>> f.read()
b'\xff\xd8\xff\xe0\x00\x10JFIF\x00...'
從文件中讀取數(shù)據(jù),需要注意編碼的問題。當(dāng)編碼錯(cuò)誤時(shí),會(huì)拋出 UnicodeDecodeError 異常。比如:
>>> f = open('some.txt', 'rt', encoding='ascii')
>>> f.read()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/local/lib/python3.6/encodings/ascii.py", line 26, in decode
return codecs.ascii_decode(input, self.errors)[0]
UnicodeDecodeError: 'ascii' codec can't decode byte 0xcc in position 2: ordinal not in range(128)
這種情況下,通常為讀取文本指定的編碼不正確,需要確認(rèn)文件編碼是否正確。如果編碼錯(cuò)誤還是存在的話,可以給 open() 函數(shù)傳遞一個(gè)可選的 errors 參數(shù)來處理這些錯(cuò)誤。比如:
>>> f = open('some.txt', 'rt', encoding='ascii', errors='replace')
>>> f.read()
'Un��ic��o��de��'
>>> f = open('some.txt', 'rt', encoding='ascii', errors='ignore')
>>> f.read()
'Unicode'
使用參數(shù) errors 能夠處理編碼錯(cuò)誤的問題,但是過程會(huì)覺得非常糟糕。這里提倡的是確保使用的是正確的編碼。模棱兩可的時(shí)候,使用默認(rèn)的設(shè)置(通常是 UTF-8)。
壓縮文件
讀取 gzip 和 bz2 格式的壓縮文件時(shí),可以使用 gzip 和 bz2 模塊。兩個(gè)模塊都為 open() 提供了另外的實(shí)現(xiàn)來解決讀取 gzip 和 bz2 兩個(gè)格式的壓縮文件的問題。例如讀取壓縮文件,示例如下:
>>> import gzip
>>> with gzip.open('some.gz', 'rt') as f:
... text=f.read()
>>> import bz2
>>> with bz2.open('some.bz2', 'rt') as f:
... text=f.read()
文件寫入
文件寫入,同樣需要調(diào)用 open() 參數(shù),但是指定的模式為 wt 或者 wb,用以表示寫文本文件或是二進(jìn)制文件:
>>> f = open('some.txt', 'wt')
>>> f.write('Hello, world!')
13
>>> f.close()
數(shù)據(jù)寫入完畢,同樣需要調(diào)用 close() 關(guān)閉文件對(duì)象。也可以 with 語(yǔ)句創(chuàng)建上下文,用以正常關(guān)閉文件對(duì)象。
類似的,寫入壓縮數(shù)據(jù)時(shí),導(dǎo)入 gzip 或者 bz2 模塊:
>>> import gzip
>>> with gzip.open('some.gz', 'wt') as f:
... f.write(text)
>>> import bz2
>>> with bz2.open('some.bz2', 'wt') as f:
... f.write(text)
寫入壓縮數(shù)據(jù)時(shí),可選參數(shù) compresslevel 可以指定一個(gè)壓縮等級(jí)。例如:
>>> with gzip.open('some.gz', 'wt', compresslevel=6) as f:
... f.write(text)
compresslevel 參數(shù)默認(rèn)值為 9,表示最高的壓縮等級(jí)。等級(jí)越低性能越好,但是壓縮程度也就越低。
使用 w 模式的 open() 函數(shù),若打開的文件在寫入前有數(shù)據(jù)內(nèi)容,則會(huì)被清除覆蓋。如果是要在已經(jīng)存在的文件中添加內(nèi)容的話,使用模式為 at 的 open() 函數(shù)。
涉及讀寫文件模式的定義及含義,內(nèi)容如下:
| 模式 | 含義 |
|---|---|
| 'r' | 讀取數(shù)據(jù)(默認(rèn)) |
| 'w' | 寫入數(shù)據(jù) |
| 'x' | 文件存在拋出異常,不存在則創(chuàng)建 |
| 'a' | 追加寫入數(shù)據(jù) |
| 'b' | 二進(jìn)制模式 |
| 't' | 文本模式(默認(rèn)) |
| '+' | 更新文件(讀寫) |
具體更詳細(xì)的內(nèi)容可以參考 Python 官方文檔。
參考資料
來源
David M. Beazley;Brian K. Jones.Python Cookbook, 3rd Edtioni.O'Reilly Media.2013.
Luciano Ramalho.Fluent Python.O'Reilly Media.2015.
“2. Built-in Functions”.docs.python.org.Retrieved 20 January 2020.
"gzip — Support for gzip files".docs.python.org.Retrieved 22 January 2020.
"bz2 — Support for bzip2 compression".docs.python.org.Retrieved 22 January 2020.
廖雪峰.“Python 教程”.liaoxuefeng.com.[2020-01-18].
以上為本篇的主要內(nèi)容。希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
利用插件和python實(shí)現(xiàn)Excel轉(zhuǎn)json的兩種辦法
轉(zhuǎn)換Excel表格到JSON格式有很多方法,下面這篇文章主要給大家介紹了關(guān)于利用插件和python實(shí)現(xiàn)Excel轉(zhuǎn)json的兩種辦法,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-11-11
基于Python+QT的gui程序開發(fā)實(shí)現(xiàn)
這篇文章主要介紹了基于Python+QT的gui程序開發(fā)實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07
基礎(chǔ)語(yǔ)音識(shí)別-食物語(yǔ)音識(shí)別baseline(CNN)
這篇文章主要介紹了一個(gè)基礎(chǔ)語(yǔ)音識(shí)別題目-食物語(yǔ)音識(shí)別baseline(CNN),代碼詳細(xì)嗎,對(duì)于想要學(xué)習(xí)語(yǔ)音識(shí)別的朋友可以參考下2021-04-04
Python數(shù)據(jù)可視化處理庫(kù)PyEcharts柱狀圖,餅圖,線性圖,詞云圖常用實(shí)例詳解
這篇文章主要介紹了Python數(shù)據(jù)可視化處理庫(kù)PyEcharts柱狀圖、餅圖、線性圖常用實(shí)例詳解,需要的朋友可以參考下2020-02-02
Python語(yǔ)言基礎(chǔ)之函數(shù)語(yǔ)法
這篇文章主要介紹了Python語(yǔ)言基礎(chǔ)中的函數(shù)語(yǔ)法,文中有詳細(xì)的代碼示例供大家參考,對(duì)學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考閱讀下2023-05-05
pandas dataframe 中的explode函數(shù)用法詳解
這篇文章主要介紹了pandas dataframe 中的explode函數(shù)用法詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-05-05
將pymysql獲取到的數(shù)據(jù)類型是tuple轉(zhuǎn)化為pandas方式
這篇文章主要介紹了將pymysql獲取到的數(shù)據(jù)類型是tuple轉(zhuǎn)化為pandas方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-05-05
Python設(shè)計(jì)模式之工廠方法模式實(shí)例詳解
這篇文章主要介紹了Python設(shè)計(jì)模式之工廠方法模式,結(jié)合實(shí)例形式較為詳細(xì)的分析了工廠方法模式的概念、原理、用法及相關(guān)操作技巧,需要的朋友可以參考下2019-01-01

