python 如何讀取大文件


一般的讀取文件的方法:

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

  print f.read()

或者

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

  for line in f.readlines():

    print line

 

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

readlines() 是一次性讀取所有內容,並按行生成一個list

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

 

讀取大幾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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM