python文件讀寫

文件讀寫的基本描述:python

open/文件操做
f=open('/tmp/hello','w')

#open(路徑+文件名,讀寫模式)

#讀寫模式:r只讀,r+讀寫,w新建(會覆蓋原有文件),a追加,b二進制文件.經常使用模式

如:'rb','wb','r+b'等等函數

讀寫模式的類型有:spa

rU 或 Ua 以讀方式打開, 同時提供通用換行符支持 (PEP 278)
w     以寫方式打開,
a     以追加模式打開 (從 EOF 開始, 必要時建立新文件)
r+     以讀寫模式打開
w+     以讀寫模式打開 (參見 w )
a+     以讀寫模式打開 (參見 a )
rb     以二進制讀模式打開
wb     以二進制寫模式打開 (參見 w )
ab     以二進制追加模式打開 (參見 a )
rb+    以二進制讀寫模式打開 (參見 r+ )
wb+    以二進制讀寫模式打開 (參見 w+ )
ab+    以二進制讀寫模式打開 (參見 a+ )指針


注意:日誌

一、使用'W',文件若存在,首先要清空,而後(從新)建立,對象

二、使用'a'模式 ,把全部要寫入文件的數據都追加到文件的末尾,即便你使用了seek()指向文件的其餘地方,若是文件不存在,將自動被建立。內存



f.read([size]) size未指定則返回整個文件,若是文件大小>2倍內存則有問題.f.read()讀到文件尾時返回""(空字串)

file.readline() 返回一行

file.readline([size]) 返回包含size行的列表,size 未指定則返回所有行

for line in f: print line #經過迭代器訪問

f.write("hello\n") #若是要寫入字符串之外的數據,先將他轉換爲字符串.

f.tell() 返回一個整數,表示當前文件指針的位置(就是到文件頭的比特數).

f.seek(偏移量,[起始位置])

用來移動文件指針

偏移量:單位:比特,可正可負

起始位置:0-文件頭,默認值;1-當前位置;2-文件尾

f.close() 關閉文件字符串

讀文件的方法:generator

read ()的方法是一次性把文件的內容以字符串的方式讀到內存, 放到一個字符串變量中it

readlines()的方法是一次性讀取全部內容, 並按行生成一個list ,

由於read()和readlines()是一次性把文件加載到內存, 若是文件較大, 甚至比內存的大小還大, 內存就會爆掉。 因此,這兩種方法只適合讀取小的文件。 

實際工做中,會碰到讀取10幾G的大文件的需求, 好比說日誌文件。 這時候就要用的新的讀取文件的方法。 這裏提供兩種方法, 有簡單,有複雜,但基本原理都是同樣的。 就是利用到生成器generator。

python 讀取大文件使用迭代器會減少內存的消耗

方法1:利用open(「」, 「」)系統自帶方法生成的迭代對象

使用with打開文件並將文件對於對象f當作迭代對象,for line in f 這種用法是把文件對象f看成迭代對象, 系統將自動處理IO緩衝和內存管理,當讀取大文件時不會一次性將文件讀取到內存中,形成內存爆掉,迭代器會將需求的內容逐次讀入內存

with open(file,'r') as f:
    for line in f:
       print(line)
逐行讀取文件內容,避免一次將文件內容所有加載到內存中;

方法二:將文件切分紅小段,每次處理完小段內容後,釋放內存

這裏會使用yield生成自定義可迭代對象, 即generator, 每個帶有yield的函數就是一個generator。 

  1. def read_in_block(file_path):  
  2.     BLOCK_SIZE = 1024  
  3.     with open(file_path, "r") as f:  
  4.         while True:  
  5.             block = f.read(BLOCK_SIZE)  # 每次讀取固定長度到內存緩衝區  
  6.             if block:  
  7.                 yield block  
  8.             else:  
  9.                 return  # 若是讀取到文件末尾,則退出  
  10.   
  11.   
  12. def test3():  
  13.     file_path = "/tmp/test.log"  
  14.     for block in read_in_block(file_path):  
  15.         print block  
相關文章
相關標籤/搜索