」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > Python 中處理大檔案並優化檔案操作

Python 中處理大檔案並優化檔案操作

發佈於2024-11-04
瀏覽:390

Handling Large Files and Optimizing File Operations in Python

在本博客系列中,我们将探索如何在 Python 中处理文件,从基础知识开始,逐步进展到更高级的技术。

在本系列结束时,您将对 Python 中的文件操作有深入的了解,使您能够有效地管理和操作文件中存储的数据。

该系列将由五篇文章组成,每篇文章都建立在上一篇文章的知识之上:

  • Python 文件处理简介:读写文件
  • 使用不同的文件模式和文件类型
  • (这篇文章)在Python中处理大文件和文件操作
  • 使用上下文管理器和异常处理实现稳健的文件操作
  • 高级文件操作:使用 CSV、JSON 和二进制文件

随着 Python 项目的增长,您可能会处理无法轻松同时加载到内存中的大文件。

高效处理大文件对于性能至关重要,尤其是在处理可能达到几 GB 的数据处理任务、日志文件或数据集时。

在这篇博文中,我们将探讨在 Python 中读取、写入和处理大文件的策略,确保您的应用程序保持响应速度和高效。


大文件的挑战

处理大文件时,您可能会遇到几个挑战:

  • 内存使用:将大文件完全加载到内存中会消耗大量资源,导致性能下降,甚至导致程序崩溃。
  • 性能:如果不进行优化,对大文件的操作可能会很慢,从而导致处理时间增加。
  • 可扩展性:随着文件大小的增长,对可扩展解决方案的需求对于保持应用程序效率变得更加重要。

为了应对这些挑战,您需要能够在不影响性能或稳定性的情况下处理大型文件的策略。


高效读取大文件

处理大文件的最佳方法之一是以较小的块读取它们,而不是将整个文件加载到内存中。

Python 提供了多种技术来完成此任务。

使用循环逐行读取文件

逐行读取文件是处理大型文本文件最节省内存的方法之一。

这种方法会在读取时处理每一行,使您可以处理几乎任何大小的文件。

# Open the file in read mode
with open('large_file.txt', 'r') as file:
    # Read and process the file line by line
    for line in file:
        # Process the line (e.g., print, store, or analyze)
        print(line.strip())

在这个例子中,我们使用for循环逐行读取文件。

strip() 方法删除任何前导或尾随空格,包括换行符。

此方法非常适合处理日志文件或数据集,其中每行代表一个单独的记录。

读取固定大小的块

在某些情况下,您可能希望以固定大小的块读取文件,而不是逐行读取。

这在处理二进制文件或需要处理数据块中的文件时非常有用。

# Define the chunk size
chunk_size = 1024  # 1 KB

# Open the file in read mode
with open('large_file.txt', 'r') as file:
    # Read the file in chunks
    while True:
        chunk = file.read(chunk_size)
        if not chunk:
            break
        # Process the chunk (e.g., print or store)
        print(chunk)

在此示例中,我们指定 1 KB 的块大小并以该大小的块读取文件。

while 循环继续读取,直到没有更多数据可供读取(块为空)。

此方法对于处理大型二进制文件或需要使用特定字节范围时特别有用。


高效写入大文件

与读取一样,高效写入大文件对于性能至关重要。

分块或批量写入数据可以防止内存问题并提高操作速度。

以块的形式写入数据

将大量数据写入文件时,分块写入比逐行写入更有效,尤其是在处理二进制数据或生成大型文本文件时。

data = ["Line 1\n", "Line 2\n", "Line 3\n"] * 1000000  # Example large data

# Open the file in write mode
with open('large_output_file.txt', 'w') as file:
    for i in range(0, len(data), 1000):
        # Write 1000 lines at a time
        file.writelines(data[i:i 1000])

在此示例中,我们生成一个大的行列表,并将它们以 1000 行为一组批量写入到文件中。

这种方法比单独编写每一行更快、更节省内存。


优化文件操作

除了高效地读写数据之外,您还可以使用其他几种优化技术来更有效地处理大文件。

使用seek() 和tell() 进行文件导航

Python 的eek() 和tell() 函数允许您在文件中导航,而无需读取整个内容。

这对于跳到大文件的特定部分或从某个点恢复操作特别有用。

  • seek(offset,whence):将文件光标移动到特定位置。偏移量是要移动的字节数,从哪里确定参考点(开始、当前位置或结束)。
  • tell():返回文件光标的当前位置。

示例:使用seek()和tell()导航文件#以读取模式打开文件

with open('large_file.txt', 'r') as file:
    # Move the cursor 100 bytes from the start of the file
    file.seek(100)

    # Read and print the next line
    line = file.readline()
    print(line)

    # Get the current cursor position
    position = file.tell()
    print(f"Current position: {position}")

在这个例子中,我们使用seek()将光标移动到文件中100个字节,然后读取下一行。

tell() 函数返回光标的当前位置,允许您跟踪您在文件中的位置。


对大型二进制文件使用内存视图

为了处理大型二进制文件,Python 的内存视图对象允许您处理二进制文件的片段,而无需将整个文件加载到内存中。

当您需要修改或分析大型二进制文件时,这特别有用。

示例:将内存视图与二进制文件结合使用#以读取模式打开二进制文件

with open('large_binary_file.bin', 'rb') as file:
    # Read the entire file into a bytes object
    data = file.read()

    # Create a memoryview object
    mem_view = memoryview(data)

    # Access a slice of the binary data
    slice_data = mem_view[0:100]

    # Process the slice (e.g., analyze or modify)
    print(slice_data)

在此示例中,我们将二进制文件读入字节对象并创建一个内存视图对象来访问特定的数据切片。

这使您可以通过最小化内存使用来更有效地处理大文件。


结论

在 Python 中处理大文件不一定是一项艰巨的任务。

通过分块读取和写入文件、使用seek() 和tell() 优化文件导航以及使用memoryview 等工具,您可以有效地管理最大的文件,而不会遇到性能问题。

在下一篇文章中,我们将讨论如何通过使用上下文管理器和异常处理来使文件操作更加健壮。

这些技术将有助于确保您的文件处理代码既高效又可靠,即使面对意外错误也是如此。

版本聲明 本文轉載於:https://dev.to/devasservice/handling-large-files-and-optimizing-file-operations-in-python-47lm?1如有侵犯,請聯絡[email protected]刪除
最新教學 更多>
  • 如何有效管理多個 JavaScript 和 CSS 檔案以獲得最佳頁面效能?
    如何有效管理多個 JavaScript 和 CSS 檔案以獲得最佳頁面效能?
    管理多個JavaScript 和CSS 檔案:最佳實踐組織過多的JavaScript 和CSS 檔案可能會帶來挑戰,特別是在保持最佳頁面性能方面。下面列出了有效解決此問題的最佳實踐。 PHP Minify:簡化 HTTP 請求不要載入大量單獨的文件,而是考慮使用 PHP Minify。該工具將多個 ...
    程式設計 發佈於2024-11-08
  • 我的 Amazon SDE 面試經驗 – 5 月 4 日
    我的 Amazon SDE 面試經驗 – 5 月 4 日
    我的 Amazon SDE 面试经历 – 2024 年 5 月 2024 年 5 月,我有机会面试亚马逊的软件开发工程师 (SDE) 职位。这一切都始于一位招聘人员通过 LinkedIn 联系我。我很惊喜,因为它总是令人兴奋。 一切是如何开始的 招聘人员专业且清晰,...
    程式設計 發佈於2024-11-08
  • 如何在 cURL POST 請求中傳送多個影像?
    如何在 cURL POST 請求中傳送多個影像?
    在cURL POST 請求中使用陣列在嘗試使用cURL 傳送影像陣列時,使用者可能會遇到僅第一個影像的問題傳輸數組值。這個問題探討如何修正這個問題。 原始程式碼似乎在陣列結構上有一個小缺陷。要解決此問題,建議使用 http_build_query 來正確格式化陣列:$fields = array( ...
    程式設計 發佈於2024-11-08
  • 為什麼 $_POST 中的 Axios POST 資料不可存取?
    為什麼 $_POST 中的 Axios POST 資料不可存取?
    Axios Post 參數未由$_POST 讀取您正在使用Axios 將資料發佈到PHP 端點,並希望在$ 中存取它_POST 或$_REQUEST。但是,您目前無法檢測到它。 最初,您使用了預設的 axios.post 方法,但由於懷疑標頭問題而切換到提供的程式碼片段。儘管發生了這種變化,數據仍然...
    程式設計 發佈於2024-11-08
  • ## JPQL 中的建構函數表達式:使用還是不使用?
    ## JPQL 中的建構函數表達式:使用還是不使用?
    JPQL 中的建構子表達式:有益或有問題的實踐? JPQL 提供了使用建構函式表達式在 select 語句中建立新物件的能力。雖然此功能提供了某些優勢,但它引發了關於其在軟體開發實踐中是否適用的問題。 建構函數表達式的優點建構函數表達式允許開發人員從實體中提取特定資料並進行組裝,從而簡化了資料檢索將...
    程式設計 發佈於2024-11-08
  • 原型
    原型
    創意設計模式之一。 用於建立給定物件的重複/淺副本。 當直接建立物件成本高昂時,此模式很有用,例如:如果在查詢大型資料庫後建立對象,則一次又一次地建立該物件在效能方面並不經濟。 因此,一旦創建了對象,我們就緩存該對象,並且在將來需要相同的對象時,我們從緩存中獲取它,而不是從數據庫中再次創建它,...
    程式設計 發佈於2024-11-08
  • Python 變數:命名規則和型別推斷解釋
    Python 變數:命名規則和型別推斷解釋
    Python 是一種廣泛使用的程式語言,以其簡單性和可讀性而聞名。了解變數的工作原理是編寫高效 Python 程式碼的基礎。在本文中,我們將介紹Python變數命名規則和類型推斷,確保您可以編寫乾淨、無錯誤的程式碼。 Python變數命名規則 在Python中命名變數時,必須遵循一...
    程式設計 發佈於2024-11-08
  • 如何同時有效率地將多個欄位新增至 Pandas DataFrame ?
    如何同時有效率地將多個欄位新增至 Pandas DataFrame ?
    同時向Pandas DataFrame 添加多個列在Pandas 資料操作中,有效地向DataFrame 添加多個新列可能是一項需要優雅解決方案的任務。雖然使用帶有等號的列列表語法的直覺方法可能看起來很簡單,但它可能會導致意外的結果。 挑戰如提供的範例所示,以下語法無法如預期建立新欄位:df[['c...
    程式設計 發佈於2024-11-08
  • 從開發人員到資深架構師:技術專長與奉獻精神的成功故事
    從開發人員到資深架構師:技術專長與奉獻精神的成功故事
    一個開發人員晉升為高級架構師的真實故事 一位熟練的Java EE開發人員,只有4年的經驗,加入了一家跨國IT公司,並晉升為高級架構師。憑藉著多樣化的技能和 Oracle 認證的 Java EE 企業架構師,該開發人員已經證明了他在架構領域的勇氣。 加入公司後,開發人員被分配到一個項目,該公司在為汽...
    程式設計 發佈於2024-11-08
  • 如何在 PHP 8.1 中有條件地將元素新增至關聯數組?
    如何在 PHP 8.1 中有條件地將元素新增至關聯數組?
    條件數組元素添加在 PHP 中,有條件地將元素添加到關聯數組的任務可能是一個挑戰。例如,考慮以下數組:$arr = ['a' => 'abc'];我們如何有條件地添加'b' => 'xyz'使用array() 語句對此陣列進行運算?在這種情況下,三元運算子不是一...
    程式設計 發佈於2024-11-08
  • 從打字機到像素:CMYK、RGB 和建立色彩視覺化工具的旅程
    從打字機到像素:CMYK、RGB 和建立色彩視覺化工具的旅程
    當我還是個孩子的時候,我出版了一本關於漫畫的粉絲雜誌。那是在我擁有計算機之前很久——它是用打字機、紙和剪刀創建的! 粉絲雜誌最初是黑白的,在我的學校複印的。隨著時間的推移,隨著它取得了更大的成功,我能夠負擔得起帶有彩色封面的膠印! 然而,管理這些顏色非常具有挑戰性。每個封面必須列印四次,每種顏色...
    程式設計 發佈於2024-11-08
  • 如何將 Boehm 的垃圾收集器與 C++ 標準函式庫整合?
    如何將 Boehm 的垃圾收集器與 C++ 標準函式庫整合?
    整合 Boehm 垃圾收集器和 C 標準庫要將 Boehm 保守垃圾收集器與 C標準庫集合無縫集成,有兩種主要方法:重新定義運算符::new此方法涉及重新定義運算符::new以使用Boehm的GC。但是,它可能與現有 C 程式碼衝突,並且可能無法在不同編譯器之間移植。 明確分配器參數您可以使用而不是...
    程式設計 發佈於2024-11-08
  • 如何優化子集驗證以獲得頂級效能?
    如何優化子集驗證以獲得頂級效能?
    優化子集驗證:確保每一位都很重要確定一個清單是否是另一個清單的子集的任務在程式設計中常遇到。雖然交叉列表和比較相等性是一種簡單的方法,但考慮效能至關重要,尤其是對於大型資料集。 考慮到這種情況,需要考慮的一個關鍵因素是任何清單在多個測試中是否保持不變。由於您的場景中的其中一個清單是靜態的,因此我們可...
    程式設計 發佈於2024-11-08
  • 如何處理超出 MySQL BIGINT 限制的大整數?
    如何處理超出 MySQL BIGINT 限制的大整數?
    超出MySQL BIGINT 限制的大整數處理超出MySQL BIGINT 限制的大整數處理MySQL 的BIGINT 資料型別可能看起來是最廣泛的整數表示形式,但在處理時會出現限制超過20 位的數字。 超出BIGINT 的選項邊界當儲存需求超出BIGINT的能力時,會出現兩個選項:儲存為VARCH...
    程式設計 發佈於2024-11-08
  • 如何確保 Python Selenium 中載入多個元素?
    如何確保 Python Selenium 中載入多個元素?
    Python Selenium:確保多個元素載入透過AJAX 處理動態載入的元素時,確認其外觀可能具有挑戰性。為了處理這種情況,我們將利用 Selenium 的 WebDriverWait 及其各種策略來確保多個元素的存在。 所有元素的可見性:驗證所有與特定選擇器匹配的元素,我們可以使用visibi...
    程式設計 發佈於2024-11-08

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3