文件讀寫

讀寫文件是最多見的IO操做
Python內置了讀寫文件的函數,用法和C是兼容的
現代操做系統不容許普通的程序直接操做磁盤,即在磁盤上讀寫文件的功能都是由操做系統提供的
所以,讀寫文件就是請求操做系統打開一個文件對象(一般稱爲文件描述符),並經過操做系統提供的接口操做這個文件對象進行讀寫數據(讀寫文件)緩存

 

使用示例:網絡

讀文件函數

  f = open('/Users/michael/test.txt', 'r')  #Python內置的open()函數,'r'表示以read模式打開一個文件對象,當文件不存在時,函數拋出IOError錯誤
  f.read()  #調用read()方法可一次讀取文件所有內容,Python把內容讀到內存,用一個str對象表示        
  f.close()   #調用close()方法關閉文件
                 #文件使用完畢後必須關閉,由於文件對象會佔用操做系統的資源,而且操做系統同一時間能打開的文件數量也是有限的  

      使用try-catch
   因爲文件讀寫時都有可能產生IOError,一旦出錯,後面的f.close()就不會調用
   所以,爲了保證不管是否出錯都能正確地關閉文件,可使用try ... finally來實現編碼

  try:
    f = open('/path/to/file', 'r')
     print(f.read())
  finally:
    if f:
      f.close()

  使用with
  每次都使用try catch寫太繁瑣,Python引入了with語句來自動幫咱們調用close()方法
  該寫法代碼更簡潔,且沒必要調用f.close()方法spa

  with open('/path/to/file', 'r') as f:
       print(f.read())

  讀取圖片操作系統

  f = open('/Users/michael/test.jpg', 'rb')  #默認都是讀取文本文件,而且是UTF-8編碼的文本文件
                             #要讀取二進制文件,好比圖片、視頻等等,用'rb'模式打開文件便可

  讀取其餘編碼文件,如中文文件code

  f = open('/Users/michael/gbk.txt', 'r', encoding='gbk')  #讀取GBK編碼的文件,要讀取非UTF-8編碼的文本文件,須要給open()函數傳入encoding參數

  f = open('/Users/michael/gbk.txt', 'r', encoding='gbk', errors='ignore')  
  #忽略文本中包含非法編碼字符返回的錯誤   #遇到有些編碼不規範的文件,可能會遇到UnicodeDecodeError,由於在文本文件中可能夾雜了一些非法編碼的字符   #遇到這種狀況,open()函數還接收一個errors參數,表示若是遇到編碼錯誤後如何處理,最簡單的方式是直接忽略

 

  關於讀文件的幾種方式:視頻

     f.read() #一次性讀取文件的所有內容,但若是文件過大,會致使內存不足
     f.read(size) #每次最多讀取size個字節的內容,可避免使用f.read()時因文件過大而致使內存不足的問題
     f.readline() #每次讀取文件的一行內容
     f.readlines() #一次讀取全部內容並按行返回list
     使用何種方式需根據狀況而定:
       若是文件很小,read()一次性讀取最方便
       若是不能肯定文件大小,反覆調用read(size)比較保險
       若是是配置文件,調用readlines()最方便對象

  關於file-like Objectblog

    像open()函數返回的這種有個read()方法的對象,在Python中統稱爲file-like Object
    除了file外,還能夠是內存的字節流,網絡流,自定義流等等
    file-like Object不要求從特定類繼承,只要寫個read()方法就行
    StringIO就是在內存中建立的file-like Object,經常使用做臨時緩衝

 

寫文件

  寫文件與讀文件同樣,惟一區別是調用open()函數時,傳入標識符不一樣,如'w'或者'wb',分別表示寫文本文件或寫二進制文件

  f = open('/Users/michael/test.txt', 'w')  #寫文本
  f.write('Hello, world!')                    #可反覆調用write()來寫入文件,但必需要用close()關閉文件
  f.close()

  寫入文件(二進制)

  f = open('/Users/michael/test.txt', 'wb')  #寫二進制
  f.write(bin(100))
  f.close()

  使用with語句
  當寫文件時,操做系統每每不會馬上把數據寫入磁盤,而是放到內存緩存起來,空閒的時候再慢慢寫入
  只有調用close()方法時,操做系統才保證把沒有寫入的數據所有寫入磁盤
  若是忘記調用close(),則數據可能只寫了一部分到磁盤,剩下的丟失了,所以用with語句最保險

  with open('/Users/michael/test.txt', 'w') as f:
    f.write('Hello, world!')

  寫入文件(其餘編碼)

  with open('/Users/michael/test.txt', 'w',encoding='GBK') as f:  #要寫入特定編碼(非UTF-8)的文本文件,需傳入encoding參數,將字符串自動轉換成指定編碼
    f.write('中國')

  寫入文件(覆蓋)

  with open('/Users/michael/test.txt', 'w') as f:  #以'w'模式寫入文件時,若是文件已存在,會直接覆蓋,至關於刪掉後新寫入一個文件
    f.write('Hello, world!')  

  寫入文件(追加)

  with open('/Users/michael/test.txt', 'a') as f:  #以'a'模式寫入文件時,會直接在已存在文件結尾追加
    f.write('Hello, world!')
相關文章
相關標籤/搜索