一. 讀取文件
過程: 打開文件 讀文件內容 關閉文件 打開文件: open(path,flag,[encoding [ERRORS]]) path:要打開文件的路徑 flag :打開方式 * r 以只讀的方式打開文件 文件法人描述符放在開頭 * rb 以二進制格式打開一個文件用於只讀 文件的描述符放在開頭 (二進制用來加密) r+ 打開一個文件用於讀寫 文件的描述符放在開頭 * w 打開一個文件只用於寫入 如果該文件已經存在會覆蓋 如果不存在則創建新文件 * wb 打開一個文件只用於寫入二進制 如果該文件已經存在會覆蓋 如果不存在則創建新文件 * w+ 打開一個文件用於讀寫 a 打開一個文件用於追加 如果文件存在 文件描述符將會放到文件末尾 a+ encoding 編碼格式 常用的的是utf-8 ERRORS 錯誤處理
1.read() 與rend(參數)
# 打開文件 path=r"D:\Studypython\py2\1\01.txt" # 忽略錯誤 ignore # f=open(path,"r",encoding="utf-8",errors="ignore") f=open(path,"r",encoding="utf-8") # 讀文件內容 # 讀取文件里的所有內容 read() str1=f.read() print(str1) # my name is 哈哈哈 # i lover you to # 哈哈哈哈啦啦啦 # 關閉文件
# 打開文件 path=r"D:\Studypython\py2\01.txt" # 忽略錯誤 ignore # f=open(path,"r",encoding="utf-8",errors="ignore") f=open(path,"r",encoding="utf-8") # 讀文件內容 # 讀取文件里面10個字符 read(10) # 讀取文件里指定字符數read(n) str1=f.read(10) print(str1) # my name is # 關閉文件
2.readline() 與 readline(參數) readlines()
# 打開文件 path=r"D:\Studypython\py2\01.txt" # 忽略錯誤 ignore # f=open(path,"r",encoding="utf-8",errors="ignore") f=open(path,"r",encoding="utf-8") # 讀文件內容 #讀取文件里內容一整行 包括換行符 /n readline str1=f.readline() print(str1) # my name is 哈哈哈 # 關閉文件 path=r"E:\Studypython\py2\01.txt" # 忽略錯誤 ignore # f=open(path,"r",encoding="utf-8",errors="ignore") f=open(path,"r",encoding="utf-8") # 讀文件內容 讀取指定字符串 str1=f.readline(10) print(str1) # my name is 哈哈哈
# 打開文件 path=r"D:\Studypython\py2\01.txt" # 忽略錯誤 ignore # f=open(path,"r",encoding="utf-8",errors="ignore") f=open(path,"r",encoding="utf-8") # 讀文件內容 #讀取文件里內容 所有行 並返回列表 readlines str1=f.readlines() print(str1) # my name is 哈哈哈 #['my name is 哈哈哈\n', '\n', 'i lover you to\n', '\n', '哈哈哈哈啦啦啦'] # 關閉文件
# 打開文件 path=r"D:\Studypython\py2\01.txt" # 忽略錯誤 ignore # f=open(path,"r",encoding="utf-8",errors="ignore") f=open(path,"r",encoding="utf-8") # 讀文件內容 # 若給定的數字大於0 返回實際size節的行數 str1=f.readlines(25) print(str1) # ['my name is 哈哈哈\n', '\n', 'i lover you to\n'] # 關閉文件 f.close()
3. seek (str) 表示從第字符開始文件內容
# fileObject.seek(offset[, whence]) # 參數 # offset -- 開始的偏移量,也就是代表需要移動偏移的字節數 # whence:可選,默認值為 0。給offset參數一個定義,表示要從哪個位置開始偏移;0代表從文件開頭開始算起,1代表從當前位置開始算起,2代表從文件末尾算起。 # 返回值 # 打開文件 path=r"D:\Studypython\py2\01.txt" # 忽略錯誤 ignore # f=open(path,"r",encoding="utf-8",errors="ignore") f=open(path,"r",encoding="utf-8") # 讀文件內容 # 修改描述符的位置 # seek (str) 表示從第字符開始文件內容 # seek() 方法用於移動文件讀取指針到指定位置。 f.seek(10) str1=f.read() print(str1) # 哈哈哈 # i lover you to # 哈哈哈哈啦啦啦 # 關閉文件 f.close()
# 打開文件讀文件的一個完整的過程 方法一 # path=r"E:\Studypython\py2\1\01.txt" try: f=open(path,"r",encoding="utf-8") str1=f.read() print(str1) finally: if f: f.close() # my name is 哈哈哈 # i lover you to # 哈哈哈哈啦啦啦 # 關閉文件
# 打開文件讀文件的一個完整的過程 方法二 with open(path,"r",encoding="utf-8") as f2: print(f2.read()) # my name is 哈哈哈 # i lover you to # 哈哈哈哈啦啦啦
二 .寫文件
# 寫文件 path=r"E:\Studypython\py2\1\02.txt" f=open(path,"w",encoding="utf-8") # 1 將信息寫入緩沖區 f.write("my name is hao do you do") # 2 刷新緩沖區 # 直接把內部緩沖區的數據立刻寫入文件, 而不是被動的等待 自動刷入緩沖區 f.flush() while True: pass f.close()
# 寫文件 import time path=r"E:\Studypython\py2\1\03.txt" f=open(path,"w",encoding="utf-8") # 1 將信息寫入緩沖區 # 2 刷新緩沖區 # 直接把內部緩沖區的數據立刻寫入文件, 而不是被動的等待 自動刷入緩沖區 # f.flush() while 1: f.write("my name is hao do you doLLLLLLLLLLLLLLLLLLLLLLLLLLLL") f.flush() time.sleep(0.1) f.close()
# 寫文件 import time # 簡易寫法 寫文件 # 這種寫法不用關閉和刷新 path=r"D:\Studypython\py2\1\04.txt" with open(path,"a",encoding="utf-8")as f2: f2.write("哈哈哈哈哈啊哈哈哈哈啊哈哈哈哈哈哈哈哈")
1.案例
path=r"D:\Studypython\py2\1\05.txt" # 注意編碼和解碼的字符集要一致 # 寫入文件編碼 with open(path,"wb")as f2: str="my name is haha heee1s 張三豐" f2.write(str.encode("utf-8")) # 讀文件解碼 with open(path,"rb") as f3: data=f3.read() print(data) # b'my name is haha heee1s' 帶b的二進制 print(type(data)) # <class 'bytes'> 字節類型 newData=data.decode("utf-8") print(newData)
import pickle #數據持久性模塊 # 寫入文件 path=r"E:\Studypython\py2\2\01.txt" mylist=[1,2,3,4,5,6,"sumk is a good man fffffffffffffffffffffffffffffffffffffffffffff"] f=open(path,"wb") pickle.dump(mylist,f) f.close() # 用於序列化的兩個模塊 # json:用於字符串和Python數據類型間進行轉換 # pickle: 用於python特有的類型和python的數據類型間進行轉換 # json提供四個功能:dumps,dump,loads,load # pickle提供四個功能:dumps,dump,loads,load # pickle可以存儲什么類型的數據呢? # 所有python支持的原生類型:布爾值,整數,浮點數,復數,字符串,字節,None。 # 由任何原生類型組成的列表,元組,字典和集合。 # 函數,類,類的實例 # 讀取文件 f2=open(path,"rb") timelist=pickle.load(f2) print(timelist) f2.close() # [1, 2, 3, 4, 5, 6, 'sumk is a good man fffffffffffffffffffffffffffffffffffffffffffff']
三. 編碼
Python中默認的編碼格式是 ASCII 格式,在沒修改編碼格式時無法正確打印漢字,所以在讀取中文時會報錯。
解決方法為只要在文件開頭加入 # -*- coding: UTF-8 -*- 或者 #coding=utf-8 就行了
TF-8 --> decode 解碼 --> Unicode
Unicode --> encode 編碼 --> GBK / UTF-8 等
使用type可以查看編碼形式,unicode是‘unicode’,gbk和utf-8是‘str或bytes’。
# byte為字節,bit為位,1byte=8bit。 # 數據存儲是以“字節”(Byte)為單位,數據傳輸是以大多是以“位”(bit,又名“比特”)為單位,一個位就代 # 表一個0或1(即二進制),每8個位(bit,簡寫為b)組成一個字節(Byte,簡寫為B),是最小一級的信息單位。 # # print(help(list))
a = '編碼' # a是unicode類型 b = a.encode('utf-8') # b是utf-8類型 c = a.encode('gbk') #c是gbk類型 print (a ,b,c) print (type(a),type(b),type(c)) #python3默認是unicode類型 # 編碼 b'\xe7\xbc\x96\xe7\xa0\x81' b'\xb1\xe0\xc2\xeb' # <class 'str'> <class 'bytes'> <class 'bytes'> print("**********************************") aa=bytes('你好',encoding="GBK") # unicode 轉換成GBK的bytes print(aa) # b'\xc4\xe3\xba\xc3' # 編碼encoding print(aa.decode('GBK')) # 你好 print("**********************************") # 解(碼)decode bb=bytes('你好你是誰',encoding="utf-8") # unicode 轉換成utf-8的bytes print(bb) # b'\xe4\xbd\xa0\xe5\xa5\xbd\xe4\xbd\xa0\xe6\x98\xaf\xe8\xb0\x81' print(bb.decode("utf-8")) # 你好你是誰 print("**********************************") # 網絡編程只能二進制 # 照片和視頻也只能二進制存儲 # html 網頁也是編碼 print(ord("好")) # 22909 print(ord("A")) # 65 print(ord("5")) # 53 print(chr(68)) # D print("**********************************") #repr() 函數將對象轉化為供解釋器讀取的形式。 # 返回一個對象的 string 格式 print(repr('1')) # '1' print(repr(1)) # 1 s = 'RUNOOB' a=repr(s) print(a) # 'RUNOOB' print("****************************************************") dict = {'runoob': 'runoob.com', 'google': 'google.com'}; print(type(dict)) # <class 'dict'> cc=repr(dict) # {'runoob': 'runoob.com', 'google': 'google.com'} print(cc) print(type(cc)) # <class 'str'> print("****************************************************") decode encode str ---------> str(Unicode) ---------> str >>> u = '中文' # 指定字符串類型對象u >>> str1 = u.encode('gb2312') # 以gb2312編碼對u進行編碼,獲得bytes類型對象 >>> print(str1) b'\xd6\xd0\xce\xc4' >>> str2 = u.encode('gbk') # 以gbk編碼對u進行編碼,獲得bytes類型對象 >>> print(str2) b'\xd6\xd0\xce\xc4' >>> str3 = u.encode('utf-8') # 以utf-8編碼對u進行編碼,獲得bytes類型對象 >>> print(str3) b'\xe4\xb8\xad\xe6\x96\x87' >>> u1 = str1.decode('gb2312') # 以gb2312編碼對字符串str進行解碼,獲得字符串類型對象 >>> print('u1') '中文' >>> u2 = str1.decode('utf-8') # 報錯,因為str1是gb2312編碼的 UnicodeDecodeError: 'utf-8' codec can't decode byte 0xd6 in position 0: invalid continuation byte
# 變成二進制 字節編碼 編碼轉換成二進制 注意:解碼和編碼要一致性 name="你好" # 編碼 print(bytes(name,encoding='utf-8')) # b'\xe4\xbd\xa0\xe5\xa5\xbd' # 解碼 print(bytes(name,encoding='utf-8').decode('utf-8')) # 你好 # 編碼 print(bytes(name,encoding='gbk')) # b'\xc4\xe3\xba\xc3' # 解碼 print(bytes(name,encoding='gbk').decode('gbk')) # 你好
# 編碼 s="張三來了哈哈哈" print(type(s)) a=bytes(s,"utf-8") print(a) C=s.encode("utf-8") print(C) # <class 'str'> # b'\xe5\xbc\xa0\xe4\xb8\x89\xe6\x9d\xa5\xe4\xba\x86\xe5\x93\x88\xe5\x93\x88\xe5\x93\x88' # b'\xe5\xbc\xa0\xe4\xb8\x89\xe6\x9d\xa5\xe4\xba\x86\xe5\x93\x88\xe5\x93\x88\xe5\x93\x88'