最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python3讀取和處理超大文件的操作詳解

 更新時間:2024年04月19日 10:23:33   作者:rs勿忘初心  
在日常工作中,文件對象是我們常接觸到的可迭代類型之一,一般用?for?循環(huán)遍歷一個文件對象,可以逐行讀取它的內(nèi)容,但這種方式在碰到大文件時,可能會出現(xiàn)一些奇怪的效率問題,所以本文給大家介紹了Python3讀取和處理超大文件的操作,需要的朋友可以參考下

需求:

小明是一位 Python 初學者,在學習了如何用 Python 讀取文件后,他想要做一個小練習:計算某個文件中數(shù)字字符(0~9)的數(shù)量。

場景1:小文件處理

假設(shè)現(xiàn)在有一個測試用的小文件 small_file.txt,里面包含了一行行的隨機字符串:

feiowe9322nasd9233rl
aoeijfiowejf8322kaf9a
...

代碼示例:file_process.py

def count_digits(fname):
    """計算文件里包含多少個數(shù)字字符"""
    count = 0
   
     with open(fname) as file:
        for line in file:
            for s in line:
                if s.isdigit():
                    count += 1
    return count
 
 
fname = "./small_file.txt"
print(count_digits(fname))

運行結(jié)果:

# 運行腳本
python3 ./file_process.py
 
# 輸出結(jié)果
13

場景2:大文件處理

假設(shè)現(xiàn)在我們的大文件big_file.txt,大小有5G,且所有的文本都在一行。

大文件 big_file.txt

df2if283rkwefh... <剩余 5 GB 大小> ...

卻發(fā)現(xiàn)同樣的程序花費了一分多鐘才給出結(jié)果,并且整個執(zhí)行過程耗光了筆記本電腦的全部 4G 內(nèi)存。

問題分析:

為什么同一份代碼用于大文件時,效率就會變低這么多呢?原因就藏在小明讀取文件的方法里。

在代碼里所使用的文件讀取方式,可謂 Python 里的“標準做法”:首先用 with open (fine_name) 上下文管理器語法獲得一個文件對象,然后用 for 循環(huán)迭代它,逐行獲取文件里的內(nèi)容。為什么這種文件讀取方式會成為標準?這是因為它有兩個好處:

(1) with 上下文管理器會自動關(guān)閉文件描述符;

(2) 在迭代文件對象時,內(nèi)容是一行一行返回的,不會占用太多內(nèi)存。

不過這套標準做法雖好,但不是沒有缺點。假如被讀取的文件里 根本就沒有任何換行符,那么上面列的第 (2) 個好處就不再成立。缺少換行符以后,程序遍歷文件對象時就不知道該何時中斷,最終只能一次性生成一個巨大的字符串對象,白白消耗大量時間和內(nèi)存。這就是 count_digits() 函數(shù)在處理 big_file.txt 時變得異常緩慢的原因。

要解決這個問題,我們需要把這種讀取文件的“標準做法”暫時放到一邊。

解決方法:

使用 while 循環(huán)加 read() 方法分塊讀取。

除了直接遍歷文件對象來逐行讀取文件內(nèi)容外,我們還可以調(diào)用更底層的 file.read() 方法。與直接用循環(huán)迭代文件對象不同,每次調(diào)用 file.read(chunk_size), 會馬上讀取從當前游標位置往后 chunk_size 大小的文件內(nèi)容,不必等待任何換行符出現(xiàn)。有了 file.read() 方法的幫助,優(yōu)化后的代碼:

def count_digits_v2(fname):
    """計算文件里包含多少個數(shù)字字符,每次讀取 8 KB"""
    count = 0
    block_size = 1024 * 8
    with open(fname) as file:
        while True:
            chunk = file.read(block_size)
            # 當文件沒有更多內(nèi)容時,read 調(diào)用將會返回空字符串 ''
            if not chunk:
                break
            for s in chunk:
                if s.isdigit():
                    count += 1
    return count
 
 
fname = "./big_file.txt"
print(count_digits_v2(fname))

在新函數(shù)中,我們使用了一個 while 循環(huán)來讀取文件內(nèi)容,每次最多讀 8 KB,程序不再需要在內(nèi)存中拼接長達數(shù)吉字節(jié)的字符串,內(nèi)存占用會大幅降低。

(吉字節(jié)是一種數(shù)據(jù)存儲單位,通常用于表示大容量存儲設(shè)備的容量大小。它等于1024^3(1,073,741,824)字節(jié),或者1,024兆字節(jié)。在計算機領(lǐng)域,常用于描述大型文件、程序或數(shù)據(jù)集的大小,例如硬盤容量、內(nèi)存容量等。)

拓展:用Python讀取超大文件中的部分行

Python文件讀取一直是python的常見用法,通用方法是直接readlines加載所有行。
但是,對于超大文件(如100G的tsv),直接加載所有行會非常慢。

如果是想遍歷整個文件并處理每一行,其實并不需要一次加載所有行。

這里用迭代器的方法來讀取文件:

file_name = 'all_items.tsv'
start_line = 110000
end_line = 120000
with open(file_name) as f:
	for i in range(0, start_line):
        next(f)
    lines = [next(f) for i in range(start_line, end_line)]
print(len(lines))

對于大文件all_items.tsv,咱們只讀取某一個區(qū)間的行來進行處理。先用迭代器滾動到start_line的位置,再開始讀取。
如果咱們可以利用迭代器,把這個文件的行遍歷一遍(并對行進行處理):

file_name = 'all_items.tsv'
def process_line(line):
    return line
with open(file_name) as f:
    while True:
        try:
            line = next(f)
            process_line(line)
        except StopIteration:
            break

用一個while循環(huán)就可以完成從頭到尾行的遍歷。

以上就是Python3讀取和處理超大文件的操作詳解的詳細內(nèi)容,更多關(guān)于Python3讀取和處理超大文件的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • selenium獲取當前頁面的url、源碼、title的方法

    selenium獲取當前頁面的url、源碼、title的方法

    這篇文章主要介紹了selenium獲取當前頁面的url、源碼、title的方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-06-06
  • Python列表與元組操作技巧分享

    Python列表與元組操作技巧分享

    Python 中的列表(List)和元組(Tuple)是兩種常用的數(shù)據(jù)結(jié)構(gòu),它們都可以用來存儲一系列的元素,在本文中,我們將分享一些 Python 中列表和元組的操作技巧,幫助您更好地理解它們的用法和特性,需要的朋友可以參考下
    2024-05-05
  • python?pip安裝庫下載源更換(清華源、阿里源、中科大源、豆瓣源)

    python?pip安裝庫下載源更換(清華源、阿里源、中科大源、豆瓣源)

    為了提高Python包的下載速度和穩(wěn)定性,可以配置國內(nèi)的鏡像源,如清華源、阿里源、中科大源和豆瓣源,設(shè)置方法簡單,只需更改pip的配置文件或使用命令行即可,需要的朋友可以參考下
    2024-10-10
  • Python在groupby分組后提取指定位置記錄方法

    Python在groupby分組后提取指定位置記錄方法

    下面小編就為大家分享一篇Python在groupby分組后提取指定位置記錄方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-04-04
  • Python數(shù)據(jù)結(jié)構(gòu)之列表與元組詳解

    Python數(shù)據(jù)結(jié)構(gòu)之列表與元組詳解

    序列是Python中最基本的數(shù)據(jù)結(jié)構(gòu)。序列中的每個元素都分配一個數(shù)字 - 它的位置,或索引,第一個索引是0,第二個索引是1,依此類推,元組與列表類似,不同之處在于元組的元素不能修改。元組使用小括號,列表使用方括號
    2021-10-10
  • python 阿里云oss實現(xiàn)直傳簽名與回調(diào)驗證的示例方法

    python 阿里云oss實現(xiàn)直傳簽名與回調(diào)驗證的示例方法

    這篇文章主要介紹了python 阿里云oss實現(xiàn)直傳簽名與回調(diào)驗證,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-03-03
  • numpy 對矩陣中Nan的處理:采用平均值的方法

    numpy 對矩陣中Nan的處理:采用平均值的方法

    今天小編就為大家分享一篇numpy 對矩陣中Nan的處理:采用平均值的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-10-10
  • 使用Python批量將.ncm格式的音頻文件轉(zhuǎn)換為.mp3格式的實戰(zhàn)詳解

    使用Python批量將.ncm格式的音頻文件轉(zhuǎn)換為.mp3格式的實戰(zhàn)詳解

    本文詳細介紹了如何使用Python通過ncmdump工具批量將.ncm音頻轉(zhuǎn)換為.mp3的步驟,包括安裝、配置ffmpeg環(huán)境變量及解決轉(zhuǎn)碼警告,實現(xiàn)自動化格式轉(zhuǎn)換,需要的朋友可以參考下
    2025-09-09
  • 詳解python之配置日志的幾種方式

    詳解python之配置日志的幾種方式

    本篇文章主要介紹了詳解python之配置日志的幾種方式,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-05-05
  • Python打工人必備之windows倒計時鎖屏功能的實現(xiàn)

    Python打工人必備之windows倒計時鎖屏功能的實現(xiàn)

    每個人的電腦里都會有不想讓別人知道的隱私,或者是上班時間偷偷摸魚怕被發(fā)現(xiàn)的小秘密。那怎么辦?就干脆把隱私鎖起來!從源頭上杜絕被他人偷窺自己的隱私。本文就來用Python實現(xiàn)一個windows倒計時鎖屏功能,需要的可以參考一下
    2023-04-04

最新評論

阿克| 宿州市| 天津市| 桑日县| 陆河县| 广州市| 南通市| 望城县| 嘉兴市| 望江县| 隆德县| 星座| 花莲市| 大竹县| 建瓯市| 平塘县| 南涧| 江油市| 桦南县| 北海市| 渝北区| 乌拉特前旗| 铜川市| 巨野县| 乡宁县| 佛教| 凉城县| 乳山市| 温宿县| 车险| 鹿泉市| 武安市| 运城市| 新乐市| 黔南| 安多县| 华亭县| 磐石市| 徐汇区| 浑源县| 乌拉特中旗|