python--文件操做

  博客地址:http://www.cnblogs.com/yudanqu/編碼

 

1、讀文件

  要把大象裝冰箱,須要分幾步?對於讀寫文件也是這樣簡單的流程,打開文件、讀取文件和關閉文件。spa

  描述符:文件全部操做涉及到描述符,描述符就是一個光標,讀取數據能夠從光標開始向後依次讀,等等。操作系統

一、打開文件

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 忽略錯誤,通常不寫後兩個參數

二、讀文件內容

 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) # 改到第幾個字符的位置

三、關閉文件

1 f.close()

四、小栗子

# 一個完整的過程

try:
    f1.open(path, "r", encoding="utf-8")
    print(f1.read())
finally:
    if f1:
        f1.close()

# try...except...else...finally是異常處理的內容,這個例子用到的部分表示,若是打開讀取文件部分出錯,只要文件存在那麼就在最後把文件關閉,這是一個很好的習慣,就好比說在Linux操做系統中,限制打開的文件數不超過1024個若是超過了,文件就打不開了

  固然這樣寫文件有些繁雜,那麼還有更方便的方法:code

# 簡單方法:

with open(path, "r", encoding="utf-8") as f2:
    print(f2.read())

# with能夠把文件關閉的部分實現,不論咱們是否操做,是否有錯誤,都會在最後幫咱們把文件關閉,也避免了咱們忘記關文件的困擾

 

2、寫文件

 1 f = open(path,"w") # 首先以寫方式打開文件
 2 
 3 # 將信息寫入緩衝區,而並無直接寫入文件當中,也就是說咱們在寫文件時看文件中,沒有信息隨時寫入
 4 f.write("glabscufn")
 5 
 6 # 刷新緩衝區(要想邊寫邊存入文件的話能夠手動刷新緩衝區)
 7 f.flush() # 直接把內部緩衝區的數據馬上寫入文件,而不是被動的等待文件關閉自動刷新緩衝區寫入
 8 
 9 '''
10 緩衝區的刷新:
11 一、文件關閉自動刷新 
12 二、手動flush刷新 
13 三、緩衝區滿了也能夠自動刷新 
14 四、再有就是遇到'\n'也會刷新
15 '''
16 
17 f.close()

 

3、編碼與解碼

一、編碼

1 with open(path, "wb") as f1:
2     str = "asdasdasdasd"
3     f1.write(str.encode('utf-8')) # 用utf-8編碼

二、 解碼

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 # 若是是二進制的字符串,要記得編碼解碼

 

4、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)blog

  博客地址:http://www.cnblogs.com/yudanqu/內存

相關文章
相關標籤/搜索