1.檔案的讀寫
1.1.檔案的建立與寫入
- 利用內建函式open獲取檔案物件
- 檔案操作的模式之寫入
- 檔案物件的操作方法之寫入儲存
1 # coding:utf-8 2 3 import os 4 5 current_path=os.getcwd() 6 file_path=os.path.join(current_path,'test_os.txt') 7 8 f=open(file_path,'w',encoding="utf-8") #Windows系統在寫入中文時需要設定編碼格式 9 f.write("Hello Python;你好 Python") 10 #f.read() io.UnsupportedOperation: not readable,控制檯報錯,因為f是w模式 11 f.close() 12 13 f=open(file_path,'w+',encoding="utf-8") #Windows系統在寫入中文時需要設定編碼格式 14 f.write("Hello World;你好 世界") 15 print(f.read()) #無內容輸出,read讀取檔案的話 是從最後一個角標讀取 16 f.seek(0) #此時呼叫seek,選擇從索引開始讀取,則會讀取所有剛才寫入的字串 17 print(f.read()) #Hello World;你好 世界 18 f.close() 19 20 f=open(file_path,'ab')#a:追加,b:位元型別 21 message="python很有意思" 22 #message=b"python很有意思" SyntaxError: bytes can only contain ASCII literal characters.之前的知識,我們使用b對字串內容轉譯成位元型別報錯,因為b特型別不能有漢字,所以得采用其他辦法 23 _message=message.encode("utf-8") #將字串變成位元型別 24 f.write(_message) 25 f.close() 26 27 f=open(file_path,'a') 28 message=("1\n","2\n","3\n") 29 f.writelines(message) 30 f.close()1 # coding:utf-8 2 import os 3 4 #練習1:自動建立python包 5 def creat_package(path): 6 if os.path.exists(path): 7 raise Exception('%s 已經存在,不可建立'% path) 8 os.makedirs(path) 9 init_path=os.path.join(path,'__init__.py') 10 f=open(init_path,'w') 11 f.write('# coding:utf-8\n') 12 f.close() 13 14 if __name__=='__main__': 15 current_path=os.getcwd() 16 path=os.path.join(current_path,'test1') 17 creat_package(path)1 # coding:utf-8 2 import os 3 4 #練習2:寫入檔案 5 class Open(object): 6 def __init__(self,path,mode='w',is_return=True): 7 self.path=path 8 self.mode=mode 9 self.is_return=is_return 10 11 def write(self,message): 12 f=open(self.path,mode=self.mode) 13 if self.is_return: 14 message= '%s\n' %message 15 f.write(message) 16 f.close() 17 18 if __name__=='__main__': 19 current_path=os.getcwd() 20 open_path=os.path.join(current_path,'a.txt') 21 o=Open(open_path) 22 o.write("Hello World")1 # coding:utf-8 2 import os 3 4 #練習2:容錯處理完善 5 class Open(object): 6 def __init__(self,path,mode='w',is_return=True): 7 self.path=path 8 self.mode=mode 9 self.is_return=is_return 10 11 def write(self,message): 12 f=open(self.path,mode=self.mode) 13 if message.endswith("\n"): 14 self.is_return=False 15 if self.is_return: 16 message= '%s\n' %message 17 try: 18 f.write(message) 19 finally: 20 f.close() 21 22 if __name__=='__main__': 23 current_path=os.getcwd() 24 open_path=os.path.join(current_path,'a.txt') 25 o=Open(open_path,'a') 26 o.write("Hello World\n")
1.2.檔案的讀操作
- 檔案操作的模式之讀
r:返回資料型別為字串;rb:讀取bit型別
- 檔案物件的操作方法之讀取
1 # coding:utf-8 2 3 import os 4 5 file_path=os.getcwd() 6 file=os.path.join(file_path,'a.txt') 7 8 #read用法,讀取檔案所有內容,返回的是字串,read可以和seek配合使用,重置角標去取 9 f=open(file,'r') 10 # data=f.read() 11 # print(data) 12 ''' 13 Hello World 14 Hello World 15 Hello World 16 ''' 17 18 #readlines用法,返回的是一個列表,每個元素帶\n換行 19 ''' 20 data=f.readlines() 21 print(data) #['Hello World\n', 'Hello World\n', 'Hello World\n'] 22 _data=[] 23 for i in data: 24 temp=i.strip() #strip預設去除空格,換行符等 25 if temp != '': #去除空行 26 _data.append(temp) 27 print(_data) #['Hello World', 'Hello World', 'Hello World'] 28 ''' 29 30 #readline用法,逐行去取 31 ''' 32 data=f.readline() 33 print(data) #Hello World 34 data=f.readline() 35 print(data) #123 36 ''' 37 38 #mode用法,使用什麼方式開啟open(path,mode)檔案,返回mode的值 39 print(f.mode) #r 40 41 #name用法,返回檔名稱 42 print(f.name) #D:\WorkSpace\Python_Study\a.txt 43 print(os.path.split(f.name)[1]) #a.txt 44 45 #closed用法,檔案是否關閉 46 print(f.closed) #False 47 f.close() 48 print(f.closed) #True1 # coding:utf-8 2 import os 3 4 #檔案讀寫簡單封裝: 5 class Open(object): 6 def __init__(self,path,mode='w',is_return=True): 7 self.path=path 8 self.mode=mode 9 self.is_return=is_return 10 11 def write(self,message): 12 f=open(self.path,mode=self.mode) 13 if message.endswith("\n"): 14 self.is_return=False 15 if self.is_return: 16 message='%s\n'%message 17 try: 18 f.write(message) 19 finally: 20 f.close() 21 22 def read(self,is_strip=True): 23 result=[] 24 with open(self.path,mode=self.mode) as f: 25 data=f.readlines() 26 for line in data: 27 if is_strip: #is_strip需不需要去掉每個元素的\n 28 temp=line.strip() 29 if temp != '': 30 result.append(temp) 31 else: 32 if line !='': 33 result.append(line) 34 return result 35 36 if __name__=='__main__': 37 carrent_path=os.getcwd() 38 file_path=os.path.join(carrent_path,'a.txt') 39 o=Open(file_path,mode='r') 40 data=o.read() 41 print(data)
2.檔案的應用
2.1.序列化
- 初識序列化與反序列化
- 序列化:將物件資訊或資料結構資訊進行轉換,達到儲存和傳輸的目的,最終的資料型別是有一定規則的字串,可用於檔案儲存或網路傳輸
- 反序列化:通過序列化生成的字串反轉回原來的形式
- 可序列化的資料型別
- 可序列化:number,str,list,tuple,dict(最常用的序列化資料型別)
- 不可序列化:類,例項化物件,函式,集合不能進行序列化
- Python中的json:通用序列化模組,所有程式語言都有,序列化與反序列化規則統一
- Python中的pickle:只使用python程式語言,pickle效能比json好
1 # coding:utf-8 2 import json 3 4 a=99 5 b='str' 6 c=(1,2,3) 7 d=[4,5,6] 8 e={"name":"中國"} 9 10 #json序列化 11 a_json=json.dumps(a) 12 print(a_json,type(a_json)) #99 <class 'str'> 13 b_json=json.dumps(b) 14 print(b_json,type(b_json)) #"str" <class 'str'> 15 c_json=json.dumps(c) 16 print(c_json,type(c_json)) #[1, 2, 3] <class 'str'> 17 d_json=json.dumps(d) 18 print(d_json,type(d_json)) #[4, 5, 6] <class 'str'> 19 e_json=json.dumps(e) 20 print(e_json,type(e_json)) #{"name": "\u4e2d\u56fd"} <class 'str'> 21 22 #json反序列化 23 print(json.loads(a_json),type(json.loads(a_json))) #99 <class 'int'> 24 print(json.loads(b_json),type(json.loads(b_json))) #str <class 'str'> 25 print(json.loads(c_json),type(json.loads(c_json))) #元組反序列化後資料型別變成了列表,[1, 2, 3] <class 'list'> 26 print(json.loads(d_json),type(json.loads(d_json))) #[4, 5, 6] <class 'list'> 27 print(json.loads(e_json),type(json.loads(e_json))) #{'name': '中國'} <class 'dict'> 28 29 #特殊資料型別進行json序列化與反序列化 30 #布林型別 31 print(json.dumps(True)) #true 32 print(json.loads(json.dumps(True))) #True 33 print(json.dumps(False)) #false 34 print(json.loads(json.dumps(False))) #False 35 #空型別 36 print(json.dumps(None)) #null 37 print(json.loads(json.dumps(None))) #None1 # coding:utf-8 2 import pickle 3 4 #pickle用法同json,此處不再過多演示 5 e={"name":"中國"} 6 7 #pickle序列化 8 e_pickle=pickle.dumps(e) 9 print(e_pickle,type(e_pickle)) #b'\x80\x03}q\x00X\x04\x00\x00\x00nameq\x01X\x06\x00\x00\x00\xe4\xb8\xad\xe5\x9b\xbdq\x02s.' <class 'bytes'> 10 11 #pickle反序列化 12 print(pickle.loads(e_pickle),type(pickle.loads(e_pickle))) #{'name': '中國'} <class 'dict'>1 # coding:utf-8 2 3 import json 4 5 def read(path): 6 with open('text.json','r') as f: 7 data=f.read() 8 return json.loads(data) 9 10 def write(path,data): 11 with open(path,'w') as f: 12 if isinstance(data,dict): 13 _data=json.dumps(data) 14 f.write(_data) 15 else: 16 raise TypeError('data is dict') 17 return True 18 19 data={"name":"張三","age":18} 20 21 if __name__=="__main__": 22 write('text.json',data) 23 print(read('text.json'))
2.2.yaml的用法
2.2.1.yaml格式的介紹
2.2.2.Python的第三方包---pyyaml
2.2.3.讀取yaml檔案的方法
1 #yaml檔案內容 2 url: 3 https://www.baidu.com 4 types: 5 - 網頁 6 - 百度百科 7 - 圖片 8 dict_1: 9 name:12 10 age:181 # coding:utf-8 2 3 import yaml 4 def read(path): 5 with open(path,'r',encoding="utf-8") as f: 6 data=f.read() 7 result=yaml.load(data,Loader=yaml.FullLoader) 8 return result 9 10 if __name__=='__main__': 11 print(read("text.yaml"))
回顧: