1.文件類型:文本文件和二進制文件
硬盤中的文件保存為01010101格式,一般讀取文件是把文件從硬盤中讀取到內存中。
- 文本文件需要進行格式轉換才能讀取出來。
- 二進制文件一般用於傳輸
二進制文件:視頻圖片
2.文件打開模式
幾種不同的讀取和遍歷文件的方法比較: 如果文件很小,read()一次性讀取最方便; 如果不能確定文件大小,反復調用read(size)比較保險; 如果是配置文件,調用readlines()最方便。 普通情況,使用for循環更好,速度更快。
3.r rb讀模式
(1)r 讀模式
f = open(file='D:/工作日常/兼職白領學生空姐模特護士聯系方式.txt',mode='r',encoding='utf-8') data = f.read() f.close()
file='D:/工作日常/兼職白領學生空姐模特護士聯系方式.txt' 表示文件路徑 mode='r' 表示只讀(可以修改為其他) encoding='utf-8' 表示將硬盤上的 0101010 按照utf-8的規則去“斷句”,再將“斷句”后的每一段0101010轉換成unicode的 01010101,unicode對照表中有01010101和字符的對應關系。 f.read() 表示讀取所有內容,內容是已經轉換完畢的字符串。 f.close() 表示關閉文件
PS: 此處的encoding必須和文件在保存時設置的編碼一致,不然“斷句”會不准確從而造成亂碼。
(2)rb 二進制讀模式
二進制模式,通常用來讀取圖片、視頻等二進制文件。
注意,它在讀寫的時候是以bytes類型讀寫的,因此獲得的是一個bytes對象而不是字符串。在這個讀寫過程中,需要自己指定編碼格式。在使用帶b的模式時一定要注意傳入的數據類型,確保為bytes類型。
(3)智能檢測編碼工具:chardet
# 安裝包 C:\Users\liangshuo>pip install chardet # 代碼 import chardet f = open('file_2_gbk.txt',mode='rb' ) data = f.read() result = chardet.detect(data) print(result) # {'confidence': 1.0, 'encoding': 'ascii', 'language': ''}
(4)編碼問題
注意:
文件操作時,以 “r”或“rb” 模式打開,則只能讀,無法寫入;
硬盤上保存的文件都是某種編碼的0101010,打開時需要注意:
rb,直接讀取文件保存時原生的0101010,在Python中用字節類型表示
r和encoding,讀取硬盤的0101010,並按照encoding指定的編碼格式進行斷句,再將“斷句”后的每一段0101010轉換成unicode的 010101010101,在Python中用字符串類型表示
4.w wb寫模式
(1)w模式
f = open(file='D:/工作日常/兼職白領學生空姐模特護士聯系方式.txt',mode='w',encoding='utf-8') f.write('北大本科美國留學一次50,微信號:xxxxx') f.close()
file='D:/工作日常/兼職白領學生空姐模特護士聯系方式.txt' 表示文件路徑 mode='w' 表示只寫 encoding='utf-8' 將要寫入的unicode字符串編碼成utf-8格式 f.write(...) 表示寫入內容,寫入的內容是unicode字符串類型,內部會根據encoding轉換為制定編碼的 01101010101,即:字節類型
(2)wb模式
f = open(file='D:/工作日常/兼職白領學生空姐模特護士聯系方式.txt',mode='wb') f.write('北大本科美國留學一次50,微信號:xxxxx'.encode('utf-8')) f.close()
file='D:/工作日常/兼職白領學生空姐模特護士聯系方式.txt' 表示文件路徑 mode='wb' 表示只以2進制模式寫 f.write(...) 表示寫入內容,寫入的內容必須字節類型,即:是某種編碼格式的0101010
(3)編碼問題
注意:
文件操作時,以 “w”或“wb” 模式打開,則只能寫,並且在打開的同時會先將內容清空。
寫入到硬盤上時,必須是某種編碼的0101010,打開時需要注意:
wb,寫入時需要直接傳入以某種編碼的0100101,即:字節類型
w 和 encoding,寫入時需要傳入unicode字符串,內部會根據encoding制定的編碼將unicode字符串轉換為該編碼的 010101010
5.a ab追加模式
f = open("兼職白領學生空姐模特護士聯系方式.txt",'a',encoding="gbk") f.write("\n杜姍姍 北京 167 49 13324523342") f.close() # 姓名 地區 身高 體重 電話 況詠蜜 北京 171 48 13651054608 ...... 岳妮妮 深圳 177 54 18835324553 賀婉萱 深圳 174 52 18933434452 葉梓萱 上海 171 49 18042432324 杜姍姍 北京 167 49 13324523342 #這行是添加的
文件操作時,以 “a”或“ab” 模式打開,則只能追加,即:在原來內容的尾部追加內容
寫入到硬盤上時,必須是某種編碼的0101010,打開時需要注意:
ab,寫入時需要直接傳入以某種編碼的0100101,即:字節類型
a 和 encoding,寫入時需要傳入unicode字符串,內部會根據encoding制定的編碼將unicode字符串轉換為該編碼的 010101010
6.混合模式r+ w+
(1)r+ 讀寫模式
f = open('file_2_gbk.txt',mode='r+' ) data = f.read() # 讀內容 print(data) f.write('\nthis is last') #寫內容 f.close()
(2)w+寫讀模式(沒用)
w+會先把文件清空,再寫新內容,
相比w模式,只是支持了一個讀功能,且還只能讀已經寫入的新內容。着實沒什么卵用。。。
7. with關鍵字
with關鍵字用於Python的上下文管理器機制。為了防止諸如open這一類文件打開方法在操作過程出現異常或錯誤,或者最后忘了執行close方法,文件非正常關閉等可能導致文件泄露、破壞的問題。Python提供了with這個上下文管理器機制,保證文件會被正常關閉。在它的管理下,不需要再寫close語句。注意縮進。
with open('test.txt', 'w') as f: f.write('Hello, world!')
with支持同時打開多個文件:
with open('log1') as obj1, open('log2','w') as obj2: s=obj1.read() obj2.write(s)
8.遍歷文件
實際上,更多的時候,我們將文件對象作為一個迭代器來使用。
f = open('file_2_gbk.txt',mode='r' )
for line in f: print(line,end='') f.close() # 111111111 22222222 33333333 4444444
這個方法很簡單, 不需要將文件一次性讀出,但是同樣沒有提供一個很好的控制,與readline方法一樣只能前進,不能回退。