在實(shí)際開(kāi)發(fā)中,常常需要對(duì)程序中的數(shù)據(jù)進(jìn)行操作品抽,而實(shí)現(xiàn)數(shù)據(jù)持久化最直接簡(jiǎn)單的方式就是將數(shù)據(jù)保存到文件中卑笨。說(shuō)到“文件”這個(gè)詞距潘,可能需要先科普一下關(guān)于[文件系統(tǒng)]的知識(shí)炼列,對(duì)于這個(gè)概念,維基百科上給出了很好的詮釋?zhuān)@里不再浪費(fèi)筆墨音比。
在Python中實(shí)現(xiàn)文件的讀寫(xiě)操作其實(shí)非常簡(jiǎn)單俭尖,通過(guò)Python內(nèi)置的open
函數(shù),我們可以指定文件名洞翩、操作模式稽犁、編碼信息等來(lái)獲得操作文件的對(duì)象,接下來(lái)就可以對(duì)文件進(jìn)行讀寫(xiě)操作了菱农。這里所說(shuō)的操作模式是指要打開(kāi)什么樣的文件(字符文件還是二進(jìn)制文件)以及做什么樣的操作(讀缭付、寫(xiě)還是追加),具體的如下表所示循未。
r 只讀模式
w 寫(xiě)入模式
a 追加模式 寫(xiě)入文件的最后位置
r+ 讀寫(xiě)模式,卸載愿文件內(nèi)容最后追加
w+ 寫(xiě)讀模式陷猫,只要是'寫(xiě)在前'都會(huì)建一個(gè)新文件
a+ 追加模式,在原文件最后追加
rb 已二進(jìn)制文件格式讀取這個(gè)文件
ab 已二進(jìn)制文件追加這個(gè)文件
wb 已二進(jìn)制格式寫(xiě)這個(gè)文件
讀寫(xiě)文本文件
讀取文本文件時(shí)的妖,需要在使用open
函數(shù)時(shí)指定好帶路徑的文件名(可以使用相對(duì)路徑或絕對(duì)路徑)并將文件模式設(shè)置為'r'
(如果不指定绣檬,默認(rèn)值也是'r'
),然后通過(guò)encoding
參數(shù)指定編碼(如果不指定嫂粟,默認(rèn)值是None娇未,那么在讀取文件時(shí)使用的是操作系統(tǒng)默認(rèn)的編碼),如果不能保證保存文件時(shí)使用的編碼方式與encoding參數(shù)指定的編碼方式是一致的星虹,那么就可能因無(wú)法解碼字符而導(dǎo)致讀取失敗零抬。
一般打開(kāi)文件使用完以后記得關(guān)閉文件!但是使用With會(huì)自動(dòng)關(guān)閉
使用with 打開(kāi)文件判斷 會(huì)在結(jié)束的時(shí)候自動(dòng)關(guān)閉文件 如果出現(xiàn)文件報(bào)錯(cuò) 會(huì)自動(dòng)進(jìn)入報(bào)錯(cuò)列 不會(huì)使文件崩潰
try:
with open(r'/Users/Test/Desktop/文件測(cè)試操作.txt', encoding='utf-8') as f:
print(f.read())
except FileNotFoundError:
print('沒(méi)有此文件或者文件名錯(cuò)誤')
except LookupError:
print('指定了未知編碼')
except UnicodeDecodeError:
print('讀取文件時(shí)解碼錯(cuò)誤')
finally:
print('\n\n')
print('測(cè)試宽涌!可以放入任意東西F揭埂!一般放入最后執(zhí)行')
輸出結(jié)果:如果此路徑下沒(méi)有這個(gè)文件夾卸亮,有這個(gè)文件忽妒,則打開(kāi),沒(méi)有則進(jìn)入報(bào)錯(cuò)列兼贸。
循環(huán)讀取文件內(nèi)容
import time
with open(Search) as f:
for line in f:
print(line)
time.sleep(1)
print()
讀取文件到list中
with open(Search) as f:
lines = f.readlines()
print(lines)
給文件寫(xiě)入內(nèi)容
要將文本信息寫(xiě)入文件文件也非常簡(jiǎn)單段直,在使用open
函數(shù)時(shí)指定好文件名并將文件模式設(shè)置為'w'
即可。注意如果需要對(duì)文件內(nèi)容進(jìn)行追加式寫(xiě)入溶诞,應(yīng)該將模式設(shè)置為'a'
鸯檬。如果要寫(xiě)入的文件不存在會(huì)自動(dòng)創(chuàng)建文件而不是引發(fā)異常。
注意 這個(gè)方法 是直接覆蓋文件 若果目標(biāo)路徑有文件 則會(huì)打開(kāi) 螺垢,沒(méi)有 則會(huì)自動(dòng)創(chuàng)建
try:
with open('/Users/test/Desktop/文件測(cè)試操作.txt', 'w', encoding='utf-8') as reads:
reads.write('234')
except IOError as ex:
print('寫(xiě)入目標(biāo)文件錯(cuò)誤喧务,錯(cuò)誤原因:'.ex)
finally:
print('測(cè)試')
print('操作完成!’)
如果你想寫(xiě)入到最后一行 使用a+
try:
with open('/Users/test/文件測(cè)試操作.txt', 'a+', encoding='utf-8') as reads:
reads.write('\n’’測(cè)試測(cè)試測(cè)試')
except IOError as ex:
print('寫(xiě)入目標(biāo)文件錯(cuò)誤颜及,錯(cuò)誤原因:'.ex)
finally:
print('測(cè)試')
print('操作完成!')
打開(kāi)二進(jìn)制文件,并復(fù)制它蹂楣。
以一張圖片為列。
try:
with open(‘test.jpg') as fs1:
data = fs1.read()
print(type(data)) # <class 'bytes'>
with open(’test1.jpg', 'wb') as fs2:
fs2.write(data)
except FileNotFoundError as e:
print('指定的文件無(wú)法打開(kāi).')
except IOError as e:
print('讀寫(xiě)文件時(shí)出現(xiàn)錯(cuò)誤.')
print('程序執(zhí)行結(jié)束.')