通常的讀取文件的方法:緩存
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