博客地址:http://www.cnblogs.com/yudanqu/ 一、讀文件 要把大象裝冰箱,需要分幾步?對於讀寫文件也是這樣簡單的流程,打開文件、讀取文件和關閉文件。 描述符:文件所有操作涉及到描述符,描述符就是一個游標,讀取數據可以從游標開始向後依次讀,等等。 1、打開文件 path:要 ...
博客地址: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)
博客地址:http://www.cnblogs.com/yudanqu/