python 如何讀取大文件

通常的讀取文件的方法:緩存

with open(file_path, "r") as f:3d

  print f.read()對象

或者內存

with open(file_path,"r") as f:字符串

  for line in f.readlines():generator

    print lineit

 

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

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

因一次性讀取,若文件內容過大,則會將內存爆掉。報錯:「MemoryError」file

 

讀取大幾G的大文件,能夠利用生成器 generator

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

def read_in_block(file_path):

  BLOCK_SIZE=1024

  with open(file_path,"r") as f:

    while True:

      block =f.read(BLOCK_SIZE) #每次讀取固定長度到內存緩衝區

      if block:

        yield block

      else:

        return #若是讀取到文件末尾,則退出

 

for block in read_in_block(file_path):

  print block

 // 這個方法,速度很快(只有3s),但有個問題,若知足了1024時,會將正好在1024位置的數據切開,以下

cad1a596-fe14-45c4-b920-8bc0eab38ee6
c6f0c5bf-4359-4a28-9f90-3c4f61b5e12d
3815cd95-2147-4701-8d50-273325140643
c047d057-c33d-4a69-995a-5
29cb5cb04ee
afd9cffb-09f0-4347-bf12-34485969b366
3c145a79-c72c-43db-8e68-02be8046c6b4

雖然每一個block都是str, 但沒法直接獲得每行的id,只能再切分。

方法二 利用open("","")系統自帶方法生成的迭代對象

  with open(file_path) as f:

    for line in f:

      print line

for line in f 這種用法是把文件對象f看成迭代對象,系統將自動處理IO緩存和內存管理。

耗時較第1種方法慢一點,要25s。 但每一個Line, type都是str, 都是本身須要的一行數據(一行是一個id)。

 

>>> f = open("dup_file - Copy (2).txt")
>>> type(f)
<type 'file'>

>>> type(f.read())
<type 'str'>

>>> f.read()

''

>>>print  f.read()

aac66f36-d2ad-4d94-9804-2220262cc354
c5a1b5ee-32b6-4912-8b90-ece3bd36d1e5
90e6509a-e918-447e-92ee-b853b9b49f15
7b7495d3-1aa5-48b5-a305-ae137d46d605

 

>>> f.readlines()
[]

>>> type(f.readlines())
<type 'list'>

>>> print f.readlines()
[]

>>> for i in f.readlines():
... type (i)
... print i

<type 'str'>
994761db-37fa-4243-9d13-0acd193763dd

<type 'str'>
993b2806-51fe-412d-8df2-526ea550e889

<type 'str'>
aac66f36-d2ad-4d94-9804-2220262cc354

 

>>> type(f.readline())
<type 'str'>

 

 // // //

>>> f = open("dup_file - Copy (2).txt")
>>> f.readline()
'8957d983-05e2-4a54-a7b3-f1532421c7a7\n'
>>> f.readline()
'ccf30309-2a02-4d09-8ea8-70c3da8de09d\n'
>>> f.readline()
'492ddb07-e0c5-4dda-ae91-8b3700d05a79\n'
>>> f.readline()
'9cee8472-dfc1-49ac-90c3-572f68373934\n'
>>> f.readline()
''
>>> f.readline()
''

// // // 第1次調用f.readline(),沒有輸出或者操做,後面再也沒法循環到

>>> f = open("dup_file - Copy (2).txt")
>>> type(f.readline())
<type 'str'>
>>> f.readline()
'ccf30309-2a02-4d09-8ea8-70c3da8de09d\n'
>>> f.readline()
'492ddb07-e0c5-4dda-ae91-8b3700d05a79\n'
>>> f.readline()
'9cee8472-dfc1-49ac-90c3-572f68373934\n'
>>> f.readline()
''
>>> f.readline()

 

// // //  使用文件對象f

>>> f = open("dup_file - Copy (2).txt")
>>> for i in f:
... type(i)
... print i
...
<type 'str'>
8957d983-05e2-4a54-a7b3-f1532421c7a7

<type 'str'>
ccf30309-2a02-4d09-8ea8-70c3da8de09d

<type 'str'>
492ddb07-e0c5-4dda-ae91-8b3700d05a79

<type 'str'>
9cee8472-dfc1-49ac-90c3-572f68373934

 

>>> f = open("dup_file - Copy (2).txt")
>>> for i in f.readlines():
... type(i)
... print i
...
<type 'str'>
8957d983-05e2-4a54-a7b3-f1532421c7a7

<type 'str'>
ccf30309-2a02-4d09-8ea8-70c3da8de09d

<type 'str'>
492ddb07-e0c5-4dda-ae91-8b3700d05a79

<type 'str'>9cee8472-dfc1-49ac-90c3-572f68373934

相關文章
相關標籤/搜索