Python基礎知識_第10節_檔案操作(IO技術)

IrisEpode發表於2020-11-09

檔案操作(IO技術)

文字檔案和二進位制檔案

  • 文字檔案:儲存字元的檔案,python預設為unicode解碼,可以用記事本開啟的檔案。word文件不算純文字檔案,因為裡面也可以放圖片。
  • 二進位制檔案:無法用記事本開啟,必須用專用的軟體解碼。常見的有MP4視訊檔案、MP3 音訊檔案、JPG 圖片、doc 文件等等。

檔案操作相關模組概述

名稱說明
io模組檔案流的輸入和輸出操作 input output
os 模組基本作業系統功能,包括檔案操作
glob模組查詢符合特定規則的檔案路徑名
fnmatch模組使用模式來匹配檔案路徑名
fileinput 模組處理多個輸入檔案
filecmp模組用於檔案的比較
cvs模組用於 csv檔案處理
pickle 和 cPickle用於序列化和反序列化
xml包用於 XML資料處理
bz2、gzip、 zipfile、 zlib、 tarfile用於處理壓縮和解壓縮檔案(分別對應不同的演算法)

建立檔案物件open()

  • open(檔名,開啟方式)
  • 為了減少“\”的輸入,可以使用原始字串 r “檔名”
    • f = open(r"d:\b.txt",“w”)
模式描述
r讀read模式
w寫write模式。如果檔案不存在則建立;如果檔案存在,則重寫新內容;
a追加append模式。如果檔案不存在則建立;如果檔案存在,則在檔案末尾追加內容
b二進位制binary模式(可與其他模式組合使用)
+讀、寫模式(可與其他模式組合使用)

文字檔案的寫入

基本的檔案寫入操作

  • 步驟
    1. 建立檔案物件
    2. 寫入資料
    3. 關閉檔案物件
f = open(r"a.txt","a") 
s = "itbaizhan\nsxt\n" 
f.write(s) 
f.close()	# 一定要關閉文件

常用編碼介紹

  • 常用UTF-8。
  • GB2312、GBK、GB8030都是中文解碼。
    在這裡插入圖片描述

中文亂碼問題

  • Windows作業系統預設編碼時GBK,Linux作業系統預設的編碼時UTF-8。
  • Python預設編碼為Unicode。
  • 可以設定encoding為utf-8來使python在通過作業系統os來寫入檔案時,使用utf-8解碼。
f = open(r"b.txt","w",encoding="utf-8")
f.write("尚學堂\n百戰程式設計師\n")
f.close()

write()/writelines()寫入資料

  • write(a):把字串a寫入到檔案中
  • writelines(b):把字串列表寫入檔案中,需要自己新增換行符。
f = open(r"d:\bb.txt","w",encoding="utf-8") 
s = ["高淇\n","高老三\n","高老四\n"] 
f.writelines(s) 
f.close()

# 高淇
# 高老三
# 高老四

close()關閉檔案流

  • 必須要關閉檔案物件。
  • 可以結合異常機制finally確保關閉檔案物件。
  • 當呼叫close()方法時,首先會把緩衝區資料寫入檔案(也可以直接呼叫flush()方法),再關閉檔案,釋放檔案物件。
try:
	f = open(r"my01.txt","a")
	str = "gaoqi"
	f.write(str)
except BaseException as e:
	print(e)
finally:
	f.close()

with語句(上下文管理器)

  • with自動幫忙還原。通常會使用with語句來讀取檔案。
s = ["高淇\n","高老三\n","高老五\n"] 
with open(r"d:\bb.txt","w") as 
	f: f.writelines(s)

文字檔案的讀取

  • read(size):從檔案中讀取size個字元,並作為結果返回。如果沒有size引數,則讀取整個檔案。讀取到檔案末尾,會返回空字串。

  • readline():讀取一行內容作為結果返回。讀取到檔案末尾,會返回空字串。

  • readlines():文字檔案中,每一行作為一個字串存入列表中,返回該列表。

  • 按行讀取一個檔案

# 用Readline方式。
with open(r"bb.txt","r") as f:
	while True:
		fragment = f.readline()
		if fragment:	# 如果讀出來的行為空,則break
			break
		else:
			print(fragment,end="")
# 使用迭代器(每次返回一行)讀取文字檔案,更推薦使用。
with open(r"d:\bb.txt","r") as f: 	
	for a in f: 
		print(a,end="")

使用enumerate()函式和推導式生成列表操作每行增加行號

  • string.rstrip()去空白符
# 比較有意思,為文字檔案每一行的末尾增加行號。
為文字檔案每一行的末尾增加行號
with open("e.txt","r",encoding="utf-8") as f:
	lines = f.readlines()
	lines = [ line.rstrip()+" #"+str(index+1)+"\n" for index,line in enumerate(lines)]	# enumerate推導式生成列表
												# rstrip()去空白符
with open("e.txt","w",encoding="utf-8") as f:
	f.writelines(lines)

二進位制檔案的讀取和寫入(圖片檔案拷貝)

  • 需要在模式加入“b”:
    1. f = open(r"d:\a.txt", ‘wb’) #可寫的、重寫模式的二進位制檔案物件
    2. f = open(r"d:\a.txt", ‘ab’) #可寫的、追加模式的二進位制檔案物件
    3. f = open(r"d:\a.txt", ‘rb’) #可讀的二進位制檔案物件
# 讀取圖片檔案,實現檔案的拷貝
with open('aa.gif', 'rb') as f:
	with open('aa_copy.gif', 'wb') as w:
		for line in f.readlines():
			w.write(line)
print('圖片拷貝完成!')

檔案物件的常用方法

方法名說明
read([size])從檔案中讀取size 個位元組或字元的內容返回。若省略[size],則讀取到檔案末尾,即一次讀取檔案所有內容
readline()從文字檔案中讀取一行內容
readlines()把文字檔案中每一行都作為獨立的字串物件,並將這些物件放入列表返回
write(str)將字串 str內容寫入檔案
writelines(s)將字串列表 s 寫入檔案檔案,不新增換行符
seek(offset, whence)把檔案指標移動到新的位置,offset表示相對於whence的多少個位元組的偏移量;offset:為正往結束方向移動,為負往開始方向移動。whence:0: 從檔案頭(預設值)1:從當前位置 2:從檔案尾
tell()返回檔案指標的當前位置
truncate([size])只留下指標前 size 個位元組的內容,其餘全部刪除。如果沒有傳入 size,則當指標當前位置到檔案末尾內容全部刪除
flush()把緩衝區的內容寫入檔案,但不關閉檔案
close()把緩衝區內容寫入檔案,同時關閉檔案,釋放檔案物件相關資源

檔案任意位置操作(seek()移動檔案指標)

# seek()移動檔案指標示例
with open("e.txt","r",encoding="utf-8") as f:
	print("檔名是:{0}".format(f.name))
	print(f.tell())	# 列印指標位置
	print("讀取的內容:{0}".format(str(f.readline())))
	print(f.tell())
	f.seek(0)	# 指標移動到檔案頭
	print("讀取的內容:{0}".format(str(f.readline())))

# 檔名時:e.txt
# 0
# 讀取的內容:我love u! #1
#
# 15
# 讀取的內容:尚學堂 #2
#

使用pickle序列化

相關文章