Read a large file with python

来源:https://www.cnblogs.com/panlq/archive/2019/03/29/10618852.html
-Advertisement-
Play Games

python讀取大文件 1. 較pythonic的方法,使用with結構 文件可以自動關閉 異常可以在with塊內處理 <! more 最大的優點 :對可迭代對象 f,進行迭代遍歷:for line in f,會自動地使用緩衝IO(buffered IO)以及記憶體管理,而不必擔心任何大文件的問題。 ...


python讀取大文件

  1. 較pythonic的方法,使用with結構
    • 文件可以自動關閉
    • 異常可以在with塊內處理
        with open(filename, 'rb') as f:  
            for line in f:
                <do someting with the line>  

最大的優點:對可迭代對象 f,進行迭代遍歷:for line in f,會自動地使用緩衝IO(buffered IO)以及記憶體管理,而不必擔心任何大文件的問題。

There should be one – and preferably only one – obvious way to do it.

  1. 使用生成器generator

如果想對每次迭代讀取的內容進行更細粒度的處理,可以使用yield生成器來讀取大文件

    def readInChunks(file_obj, chunkSize=2048):
        """
        Lazy function to read a file piece by piece.  
        Default chunk size: 2kB.
        """
        while True:
            data = file_obj.read(chunkSize)
            if not data:
                break
            yield data
    f = open('bigFile')
    for chunk in readInChunks(f):
        do_something(chunk)
    f.close()
  1. linux下使用split命令(將一個文件根據大小或行數平均分成若幹個小文件)
    wc -l BLM.txt  # 讀出BLM.txt文件一共有多少行
    # 利用split進行分割
    split -l 2482 ../BLM/BLM.txt -d -a 4 BLM_
    # 將 文件 BLM.txt 分成若幹個小文件,每個文件2482行(-l 2482),文件首碼為BLM_ ,繫數不是字母而是數字(-d),尾碼繫數為四位數(-a 4)  


    # 按行數分割
    split -l 300 large_file.txt new_file_prefix
    # 文件大小分割
    split -b 10m server.log waynelog

    # 對文件進行合併:使用重定向,'>' 寫入文件  , '>>' 追加到文件中
    cat file_prefix* > large_file

在工作中的日常: 用戶信息,log日誌緩存,等都是大文件

補充:linecache模塊

當讀取一個文件的時候,python會嘗試從緩存中讀取文件內容,優化讀取速度,提高效率,減少了I/O操作

linecache.getline(filename, lineno) 從文件中讀取第幾行,註意:包含換行符
linecache.clearcache() 清除現有的文件緩存
linecache.checkcache(filename=None) 檢查緩存內容的有效性,可能硬碟內容發生改變,更新了,如果沒有參數,將檢查緩存中的所有記錄(entries)

    import linecache
    linecache.getline(linecache.__file__, 8)

題目:
現給一個文件400M(該文件是由/etc/passwd生成的),統計其中root字元串出現的次數

    import time
    sum = 0
    start = time.time()
    with open('file', 'r') as f:
        for i in f:
            new = i.count('root')
            sum+=new
    end = time.time()
    print(sum, end-start)

:有時候這個程式比c,shell快10倍,原因就是,python會讀取cache中的數據,使用緩存在內部進行優化,減少i/o,提高效率

References : How to read a large file


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • **vue可視化圖表 基於Echarts封裝好的v-charts** 近期公司又一個新的需求,要做一個訂單和銷售額統計的項目,需要用到可視化圖表來更直觀的展示數據。首先我想到的是Echarts,眾所周知Echarts是一個應用很廣的可視化圖表庫,用來展示統計數據更合適不過,但是偶然間發現了一個更為方 ...
  • 一、寫在前面 首先呢,由於之前重裝系統,又要重新配置環境,然後還有一些別的事,導致我一直沒有寫爬蟲了,不過現在又可以繼續寫了。 然後我這次說的模擬登錄新浪微博呢,不是使用Selenium模擬瀏覽器操作,畢竟Selenium的效率是真的有些低,所以我選擇用Python發送請求實現模擬登錄,整個過程還算 ...
  • import requests from bs4 import BeautifulSoup from math import ceil header = { 'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (... ...
  • 一般公司的項目一般都是用Oracle、Mysql、SQL Server等一些國外的資料庫。前段時間公司做了一個國家政府保密單位的項目,別人要求用國產資料庫,所以研究了下,最後決定用神舟通用的,其實國產也很好幾家做資料庫的還不錯,下邊簡單總結了下,以供參考 1:南大通用 公司簡介 天津南大通用數據技術 ...
  • 題目如下。解題步驟參考的是https://cloud.tencent.com/developer/news/373865中作者的思路。 1.首先,兩個四位數相加等於一個五位數,那麼這個五位數的第一位必定是1,也就是“三”=1,。 2.繼續分析“祥”+“三”,若是“祥”(8),“三”為1,那麼低位必定 ...
  • JDBC的使用流程,通過JDBC進行對資料庫增刪改查的操作及代碼封裝。 ...
  • 題意 "題目鏈接" Sol 我們可以把圖行列拆開,同時對於行/列拆成很多個聯通塊,然後考慮每個點所在的行聯通塊/列聯通塊的貢獻。 可以這樣建邊 從S向每個行聯通塊連聯通塊大小條邊,每條邊的容量為1,費用為$i$(i表示這是第幾條邊)。 從每個點所在的行聯通塊向列聯通塊連邊,容量為1,費用為0 從每個 ...
  • 想要熟練使用PyQt,還是需要深入研究下這個庫的使用,筆者這裡只是拋磚引玉。 關註公眾號「**Python專欄**」,後臺回覆:**zsxq06**,獲取本文全套代碼。 ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...