Python 讀取大檔案(相關總結)

2021-09-02 16:38:10 字數 1922 閱讀 8807

python 讀取 超大文字會帶來 以下問題:

1、記憶體溢位;

2、處理效率低;

處理問題1的思路有如下幾種方案:

1、分塊讀取。

1) read()函式會將資料一次性讀取到記憶體中,可通過將資料分塊讀取,readline()函式逐行讀取;

2) 一次限制讀取的檔案的大小,利用iter和yield來控制每次讀取的檔案位置;

# 利用生成器是可以迭代的,但只可以讀取它一次。因為用的時候才生成

# yield就是 return 返回乙個值,並且記住這個返回的位置,下次迭代就從這個位置後(下一行)開始

def read_in_blocks(file_obj, block_size = 2048):

"""逐件讀取檔案

預設塊大小:2kb

"""while true:

data = file_obj.read(block_size) # 每次讀取指定的長度

if not data:

break

yield data

with open('filename', 'r', encoding = 'utf-8') as f:

for chuck in read_in_blocks(f):

do_something(block)

3)利用python自帶的直譯器工具,利用with語句控制代碼負責開啟和關閉檔案(包括在內部塊中引發異常時),for line in f將檔案物件f視為乙個可迭代的資料型別,會自動使用io快取和記憶體管理,這樣就可以處理大資料檔案。

2、存入資料庫中進行進一步處理

3、利用pandas庫來進行處理read_csv(),利用dataframe資料格式來處理,乙個dataframe是乙個二維的表結構。pandas的dataframe可以儲存許多種不同的資料型別,並且每乙個座標軸都有自己的標籤。可以把它想象成乙個series的字典項。另一種series是乙個一維的資料類,類似於乙個list。

不過一般來說,用pandas處理小於100兆的資料,效能不是問題。當用pandas來處理100兆至幾個g的資料時,將會比較耗時,同時會導致程式因記憶體不足而執行失敗。

# python 讀取億級資料**

# pandas提供了io工具可以將大檔案分塊讀取

# 使用不同分塊大小來讀取再呼叫 pandas.concat 連線dataframe,chunksize設定在1000萬條左右速度優化比較明顯。

# 實驗結果足以說明,在非">5tb"資料的情況下,python適合做統計分析。

# encoding: utf-8

import sys

import time

import pandas as pd

t1=time.time()

reader = pd.read_csv('c:/taobao/22.csv', iterator=true)

loop = true

chunksize =10000000

chunks =

while loop:

try:

chunk = reader.get_chunk(chunksize)

except stopiteration:

loop = false

print "iteration is stopped."

df = pd.concat(chunks, ignore_index=true)

print df

t2=time.time()

print u'總共耗時:' + str(t2 - t1) + 's'

4、更加複雜和大量的資料可以借助於spark,其中spark不支援標準的json格式,僅支援單條資料為json格式。

python 讀取大檔案

以前一直沒有關注過python讀取大檔案的問題,因為一直都是順順暢暢地讀取了檔案。直到今天有人問我python怎麼讀取檔案出現了記憶體不足的錯誤?我才發現原來大檔案 gb級別 的讀取和普通檔案的讀取是不一樣的。下面介紹三種我親測可用的方法。這裡的檔案型別可以是txt,dat等型別的檔案。用read ...

python讀取大檔案

最近在學習python的過程中接觸到了python對檔案的讀取。python讀取檔案一般情況是利用open 函式以及read 函式來完成 f open filename,r f.read 這種方法讀取小檔案,即讀取遠遠大小小於記憶體的檔案顯然沒有什麼問題。但是如果是將乙個10g大小的日誌檔案讀取,即...

python讀取大檔案 python讀取大檔案

python讀取檔案對各列進行索引 可以用readlines,也可以用readline,如果是大檔案一般就用readlined a in open testfile.txt r for line in a in columnssplit line.rstrip split d columnsspli...