
博客地址:http://www.cnblogs.com/yudanqu/
一、讀文件
要把大象裝冰箱,需要分幾步?對於讀寫文件也是這樣簡單的流程,打開文件、讀取文件和關閉文件。
描述符:文件所有操作涉及到描述符,描述符就是一個光標,讀取數據可以從光標開始向后依次讀,等等。
1、打開文件
open(path, flag[, encoding][, errors])
- path:要打開文件的路徑
- flag:打開方式
- r 以只讀的方式打開文件,文件的描述符放在文件的開頭
- rb 以二進制格式打開一個文件用於只讀,文件的描述符放在文件的開頭
- r+ 打開一個文件用於讀寫,文件的描述符放在文件的開頭
- w 打開一個文件只用於寫入,如果該文件已經存在會覆蓋,不存在則創建新文件
- wb 打開一個文件只用於寫入二進制,如果該文件已經存在會覆蓋,不存在則創建新文件
- w+ 打開一個文件用於讀寫,如果該文件已經存在會覆蓋,不存在則創建新文件
- a 打開一個文件用於追加如果文件存在,文件描述符將會放到文件末尾
- a+
- encoding:編碼方式(一般utf-8)
- errors:錯誤處理(一般不處理)
1 # 小栗子 2 f = open(path, "r", encoding="utf-8", errors="ignore") 3 # ignore 忽略錯誤,一般不寫后兩個參數
2、讀文件內容
1 # 讀取文件全部內容 2 str1 = f.read() # 讀文件比較小的,大的內存放不下 3 4 # 讀取指定字符數(按字符數) 5 str2 = f.read(10) # 一個字母和一個漢字都稱為一個字符 6 7 # 讀取整行,包括"\n"字符 8 str3 = d.readline() 9 10 # 讀取指定字符數 11 str4 = f.readline(10) 12 13 # 讀取所有行並返回列表 14 str5 = f.readlines() 15 16 # 若給定的數字大於0,返回實際size字節的行數 17 str6 = f.readlines(25) # 例如25個字節,每行存10個,那么此時讀取兩行 18 19 # 修改描述符的位置 20 f.seek(10) # 改到第幾個字符的位置
3、關閉文件
1 f.close()
4、小栗子
# 一個完整的過程 try: f1.open(path, "r", encoding="utf-8") print(f1.read()) finally: if f1: f1.close() # try...except...else...finally是異常處理的內容,這個例子用到的部分表示,如果打開讀取文件部分出錯,只要文件存在那么就在最后把文件關閉,這是一個很好的習慣,就比如說在Linux操作系統中,限制打開的文件數不超過1024個如果超過了,文件就打不開了
當然這樣寫文件有些繁雜,那么還有更方便的方法:
# 簡單方法: with open(path, "r", encoding="utf-8") as f2: print(f2.read()) # with可以把文件關閉的部分實現,不論我們是否操作,是否有錯誤,都會在最后幫我們把文件關閉,也避免了我們忘記關文件的困擾
二、寫文件
1 f = open(path,"w") # 首先以寫方式打開文件 2 3 # 將信息寫入緩沖區,而並沒有直接寫入文件當中,也就是說我們在寫文件時看文件中,沒有信息隨時寫入 4 f.write("glabscufn") 5 6 # 刷新緩沖區(要想邊寫邊存入文件的話可以手動刷新緩沖區) 7 f.flush() # 直接把內部緩沖區的數據立刻寫入文件,而不是被動的等待文件關閉自動刷新緩沖區寫入 8 9 ''' 10 緩沖區的刷新: 11 1、文件關閉自動刷新 12 2、手動flush刷新 13 3、緩沖區滿了也可以自動刷新 14 4、再有就是遇到'\n'也會刷新 15 ''' 16 17 f.close()
三、編碼與解碼
1、編碼
1 with open(path, "wb") as f1: 2 str = "asdasdasdasd" 3 f1.write(str.encode('utf-8')) # 用utf-8編碼
2、 解碼
1 with open(path, "rb") as f2: 2 data = f2.read() 3 new_data = data.decode("utf-8") 4 print(type(data)) # class<byte> 5 print(type(new_data)) # class<str> 6 # 主要是在有中文的情況下,其他情況不同的碼可能也譯碼正確 7 # 如果是二進制的字符串,要記得編碼解碼
四、list,tuple,dict,set
1 import pickle # 數據持久性模塊,就是把數據存到磁盤 2 3 # 寫 4 mylist = [1,2,3,4,5,"sadd"] 5 f = open(path, "wb") 6 pickle.dump(mylist, f) 7 f.close() 8 9 # 讀 10 f1 = open(path, "rb") 11 templist = pickle.load(f1) 12 print(templist) 13 f1.close()
作者:漁單渠(yudanqu)
