{eval=Array;=+count(Array);}

亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

問答專欄Q & A COLUMN

如何使用Python讀取大文件?

TangpjTangpj 回答0 收藏2
收藏問題

3條回答

funnyZhang

funnyZhang

回答于2022-06-28 15:56

我先假設(shè)題主問的大文件在1G~20G左右,這應(yīng)該算常規(guī)的大文件。平常我在做機(jī)器學(xué)習(xí)模型時候我喜歡先在本機(jī)上做玩具模型,里面有個步驟就是經(jīng)常要讀取文件數(shù)據(jù),也差不多這么一個數(shù)據(jù)量。

一般來說,Python讀取大文件的方式可以使用原生的open函數(shù)或者pandas的read_csv函數(shù)都可以達(dá)到目的。

open函數(shù)

Python讀取文件一般是用open函數(shù)讀取,例如f=open(xx,"r")后f.read()就可以輕松讀取到文本內(nèi)容。

如果像數(shù)據(jù)比較大的情況下,可以用read(參數(shù))或者readline()的方式進(jìn)行迭代讀取,具體代碼如下:

read_csv()

read_csv是Python中一個很有名的數(shù)據(jù)分析工具包pandas里面的函數(shù),它既可以讀取txt也可以讀取csv格式文件。read_csv中有個參數(shù)是chunksize,通過指定一個chunksize分塊大小來讀取文件。具體代碼如下:

還有一個參數(shù)是iterator,可以把文件對象變?yōu)榭傻鷮ο?,只要iterator=True即可,具體代碼如下:

當(dāng)然我內(nèi)存只有8G所以讀取會比較慢,所以花了點(diǎn)時間研究了一下后有了上面這些奇淫技巧讀取速度后確實(shí)快了不少。當(dāng)然如果大家有更好的方法或建議歡迎在評論區(qū)探討交流,互相學(xué)習(xí)學(xué)習(xí)。


如果你對學(xué)習(xí)人工智能和科技新聞感興趣,歡迎訂閱我的頭條號。我會在這里發(fā)布所有與科技、科學(xué)以及機(jī)器學(xué)習(xí)有關(guān)的有趣文章。偶爾也回答有趣的問題,有問題可隨時在評論區(qū)回復(fù)和討論,看到即回。

(碼字不易,若文章對你幫助可點(diǎn)贊支持~)

評論0 贊同0
  •  加載中...
zzbo

zzbo

回答于2022-06-28 15:56

這里以讀取txt大文件為例,簡單介紹一下Python是如何讀取大文件的,系統(tǒng)內(nèi)存在8G左右,txt文件的大小為5G,實(shí)驗(yàn)環(huán)境win10+python3.6+pycharm2018,主要內(nèi)容如下:

1.首先,按照最原始的方法讀取txt文件,即用open函數(shù)直接打開txt文件,一次將所有數(shù)據(jù)讀入到內(nèi)存中,這里如果文件大于系統(tǒng)運(yùn)行內(nèi)存,會直接報(bào)Memery Error錯誤,測試代碼如下,非常簡單:

運(yùn)行這個程序,讀取花費(fèi)時間大概在41s左右,如下:

2.最基本的方法,為了提高讀取速度,以二進(jìn)制方式打開文件,測試代碼如下,對上面的代碼只需要稍微修改一下就行,open打開時,設(shè)置方式為rb:

運(yùn)行這個程序,截圖如下,讀取時間大概在7s左右,明顯比直接讀取快6倍左右:

3.為了更快的提高讀取速度,這里我們在read讀取文件的時候,可以按塊大小讀取,每次讀取一定大小的塊,依次循環(huán),直到整個文件讀完,測試代碼如下,也非常簡單:

運(yùn)行這個程序,截圖如下,讀取時間大概在3.5s左右,比上面直接讀取快2倍左右:

4.這里還有一種提高讀取的方法就是使用with open打開文件,把文件對象視為一個迭代器,系統(tǒng)會自動使用緩沖IO和內(nèi)存管理,所以讀取速度也會有一定提升,測試代碼如下:

運(yùn)行程序,讀取時間大概在26s左右,比直接讀取快1倍左右,如下:

5.當(dāng)然,對于其他類型的大文件,像CSV,Excel等,讀取時也可以按塊讀取,速度也會有明顯的提升,基本代碼如下,每次讀取一定塊大小的文件,直到整個文件讀完:

至此,我們就完成了使用Python讀取大文件??偟膩碚f,基本思想就是按塊讀取,每次只讀取一定塊大小的數(shù)據(jù),這樣讀取速度會有明顯提升,網(wǎng)上也有相關(guān)教程和資料,介紹的非常詳細(xì),感興趣的話,可以搜一下,希望以上分享的內(nèi)容能對你有所幫助吧,也歡迎大家評論、留言進(jìn)行補(bǔ)充。

評論0 贊同0
  •  加載中...
Tangpj

Tangpj

回答于2022-06-28 15:56

之前使用Python讀取超大CSV文件時,出現(xiàn)MemoryError錯誤,甚至死機(jī)。。。嘔心瀝血潛心研究后,發(fā)現(xiàn)使用pandas的read_csv模塊通過分塊讀取,可以完美解決針對超大CSV文件進(jìn)行數(shù)據(jù)分析處理時的內(nèi)存不足問題,分享一下。

pandas 安裝

Anaconda是一個開源的Python發(fā)行版本,其包含了conda、Python、numpy、pandas等180多個科學(xué)包及其依賴項(xiàng)。建議直接安裝Anaconda2 或 Anaconda3 ,最好裝64位。

下載地址如下:

https://www.anaconda.com/

read_csv官方文檔鏈接:

http://pandas.pydata.org/pandas-docs/stable/io.html#io-read-csv-table

從官方文檔中我們注意到chunksize 、iterator兩個參數(shù),下面我們就這兩個參數(shù)做詳細(xì)介紹 。

Iteration

iterator : boolean, default False

Return TextFileReader object for iteration or getting chunks with get_chunk().

chunksize : int, default None

Return TextFileReader object for iteration. See iterating and chunking below.

read_csv——chunksize參數(shù)介紹

read_csv中有個參數(shù)chunksize,通過指定一個chunksize分塊大小來讀取文件,返回的是一個可迭代的對象TextFileReader,分塊處理可以避免將所有的文件載入內(nèi)存,僅在使用的時候讀入所需內(nèi)容。數(shù)據(jù)的處理和清洗通常使用分塊的方式處理,可以大大降低內(nèi)存的使用,同時耗時要相對長一些。

輸出

read_csv——iterator參數(shù)

指定iterator=True 也可以返回一個可迭代對象TextFileReader。

輸出


其他方式

除了通過分塊避免一次性將全部內(nèi)容加載至內(nèi)存中,還可以嘗試如下方式讀取超大csv文件進(jìn)行數(shù)據(jù)分析、處理。

  1. 對數(shù)據(jù)進(jìn)行降維
  2. 增大機(jī)器內(nèi)存或使用spark集群(pyspark)


若對你有幫助,點(diǎn)贊支持哦。

評論0 贊同0
  •  加載中...

相關(guān)問題

最新活動

您已邀請0人回答 查看邀請

我的邀請列表

  • 擅長該話題
  • 回答過該話題
  • 我關(guān)注的人
向幫助了您的網(wǎng)友說句感謝的話吧!
付費(fèi)偷看金額在0.1-10元之間
<