Python基礎入門(9)- Python檔案操作

葛老頭發表於2021-12-30

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)     #True
 1 # 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)))         #None
 1 # 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:18
 1 # 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"))

 

回顧:

 

相關文章