1. 程式人生 > >Python基礎知識之檔案讀寫與修改

Python基礎知識之檔案讀寫與修改

基本操作

f = open("file1", "r")  # 開啟檔案
first_line = f.readline() # 讀一行
data = f.read() # 讀取剩下所有內容,檔案大時候不要用
f.close()  #關閉檔案

如果我們想迴圈檔案,並且在第九行輸出分割的話:

for index, line in enumerate(file.readlines()):
    if(index == 5):
        print
("-------我是分割線-------")         continue     print(line.strip())

注意: strip()方法是用來去除字串首尾空格的

但是當我們開啟一個大檔案的時候我們就會發現一個問題,file.readlines()是提前將所有行數都先讀取出來,再進行操作,那麼當我們開啟一個幾十個G的檔案的時候效果可想而知,因此上述方法基本不使用,應該使用以下方法:

count = 0
for line in file:
    if
count == 9:         print("-------我是分割線-------")         count += 1         continue     print(line)     count += 1

開啟檔案的模式有:

  • r, 只讀模式(預設)
  • w,只寫模式【不可讀;不存在則建立;存在則刪除內容】
  • a,追加模式【可讀;不存在則建立;存在則只追加內容】

“+”表示可以同時讀寫某個檔案

  • r+,可讀寫檔案【可讀;可寫;可追加】—–一般使用這個模式
  • w+,可寫讀檔案【可寫;可讀;可追加】—–基本用不到
  • a+,追加讀寫檔案

“b”表示處理二進位制檔案(如:FTP傳送上傳ISO映象檔案,Linux可忽略,windows處理二進位制檔案時需要標註)

  • rb,以二進位制的模式讀取檔案,不可以傳encoding引數
  • wb,以二進位制編碼的模式寫檔案 \
    f.write("string字串".encode())

“U”表示在讀取時,可以將\r\n \r \n自動轉換成\n(與r或r+模式同時使用)

  • rU
  • r+U

檔案的方法

  • tell() 當前檔案指向的指標,計數方式是按照字元個數
  • seek(字元位置) 查詢檔案相應字元位置\
    seek(0)就是返回到檔案開始位置,一般和tell()方法一起使用
  • encoding() 返回當前檔案編碼格式
  • flush() 重新整理當前緩衝區,建議在關閉檔案前先flush當前緩衝區。
    模仿進度條:
      import sys, time
      for i in range(20):
          sys.stdout.write("#")
          sys.stdout.flush()
          time.sleep(0.1)

在前面,我們已經注意到python寫檔案的時候,會將之前的內容刪除掉,重寫覆蓋,那麼我們如何來修改檔案呢?

檔案修改的方式

  • 將檔案載入到記憶體中像VIM那樣,再進行修改
  • 開啟一個檔案,修改完成之後寫到新檔案裡

修改檔案的思路

  1. 開啟兩個檔案
  2. 從原始檔逐行讀取,邊讀邊寫進新檔案中
  3. 通過語句進行判斷,找到需要需改的地方,修改檔案,再將修改過後的內容寫到新檔案中。
f = open("yesterday", 'r', encoding="utf-8")
fnew = open("yesterday.bak", "w", encoding="utf-8")

for line in f:
    if "修改前的語句" == line:
        line = line.replace("修改前的語句", "修改後的語句")
    fnew.write(line)
f.close()
fnew.close()

line = line.replace("修改前的語句", "修改後的語句") 注意是line而不是f

with語句

為了避免開啟檔案後忘記關閉,可以通過管理上下文,即:

with open("需要開啟的檔案", 'r', encoding="utf-8") as f:
    # 執行語句...
    # 當跳出with程式塊時,自動關閉檔案

如此方式,當with程式碼塊執行完畢後,內部會自動關閉並釋放檔案資源。
在python2.7後,with又支援同時對多個檔案的上下文進行管理,即:

with open("需要開啟的檔案1") as f, open("需要開啟的檔案2") as f2:
    # 執行語句...
    # 當跳出with程式塊時,自動關閉檔案