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

利用Python中的內置open函數(shù)讀取二進制文件

 更新時間:2022年05月30日 11:36:18   作者:??Python編程學習圈????  
這篇文章主要介紹了利用Python實現(xiàn)讀取二進制文件,文章嘗試使用Python中的內置open函數(shù)使用默認讀取模式讀取zip文件,下文詳細介紹,需要的小伙伴可以參考一下

在python中讀取一個文本文件相信大家都比較熟悉了,但如果我們遇到一個二進制文件要讀取怎么辦呢?我們嘗試使用 Python 中的內置 open 函數(shù)使用默認讀取模式讀取 zip 文件,抱歉,我們將收到錯誤消息:

>>> with open("exercises.zip") as zip_file:
...     contents = zip_file.read()
...
Traceback (most recent call last):
  File "<stdin>", line 2, in <module>
  File "/usr/lib/python3.10/codecs.py", line 322, in de
code
    (result, consumed) = self._buffer_decode(data, self.errors, final)
UnicodeDecodeError: 'utf-8' codec can't decode byte 0x8e in position 11: invalid sta
rt byte

我們收到一個錯誤,是因為 zip 文件不是文本文件,它們是二進制文件。

要從二進制文件中讀取,我們需要使用模式 rb 而不是默認模式 rt 打開它:

>>> with open("exercises.zip", mode="rb") as zip_file:
...     contents = zip_file.read()

當從二進制文件中讀取時,我們不會得到字符串。將返回一個字節(jié)對象,也稱為字節(jié)字符串:

>>> with open("exercises.zip", mode="rb") as zip_file:
...     contents = zip_file.read()
...
>>> type(contents)
<class 'bytes'>
>>> contents[:20]
b'PK\x03\x04\n\x00\x00\x00\x00\x00Y\x8e\x84T\x00\x00\x00\x00\x00\x00'

字節(jié)字符串中沒有字符:它們中有字節(jié)。

除非我們理解它們的含義,否則文件中的字節(jié)對我們沒有多大幫助。

使用庫來讀取二進制文件

處理二進制文件時,你通常會使用和知道如何處理正在使用的特定類型文件的庫(內置 Python 庫或第三方庫)。該庫將完成將文件中的字節(jié)解碼為更易于使用的工作。

例如,Python 的 ZipFile 模塊可以幫助我們讀取 zip 文件中的數(shù)據(jù):

>>> from zipfile import ZipFile
>>>
>>> with ZipFile("exercises.zip") as zip_file:
...     test_file = zip_file.read("exercises/test.py").decode("utf-8")
...
>>> test_file[:30]
'#!/usr/bin/env python3\nfrom __'

如果有人已經(jīng)完成了這項工作,最好避免實現(xiàn)自己的字節(jié)檢查或字節(jié)操作邏輯。

在 Python 中以字節(jié)級別工作

有時你會使用或被要求直接在字節(jié)級別工作的庫或 API。在這種情況下,你需要至少需要對二進制文件和字節(jié)字符串有一點了解。

例如,假設我們要計算給定文件的 sha256 校驗和。

在這里,我們有一個名為 get_sha256_hash 的函數(shù)來執(zhí)行此操作:

import hashlib
def get_sha256_hash(filename):
    with open(filename, mode="rb") as f:
        return hashlib.sha256(f.read()).hexdigest()

此函數(shù)讀取此文件中的所有二進制數(shù)據(jù)。我們正在讀取字節(jié),因為 Python 的 hashlib 模塊要求我們使用字節(jié)。hashlib 模塊在底層工作:它使用字節(jié)而不是字符串。

因此,我們傳入文件中的所有字節(jié)以獲取哈希對象,然后對該哈希對象調用 hexdigest 方法以獲取表示該文件的 SHA-256 校驗和的十六進制字符串:

>>> get_sha256_hash("exercises.zip")
'9e98242a21760945ec815668fc79d8621fa15dd23659ea29be2c5949153fe96d'

此功能運行良好,但使用此功能讀取非常大的文件可能會出現(xiàn)問題。

分塊讀取二進制文件

我們的 get_sha256_hash 函數(shù)一次將整個文件讀入內存。一個非常大的文件可能會占用大量內存。

對于文本文件,解決此問題的常用方法是逐行讀取文件。但是二進制文件不一定有行!但是,我們可以嘗試逐塊讀取。

首先,我們將從文件中讀取一個 8 KB 的塊:

import hashlib
def get_sha256_hash(filename, buffer_size=2**10*8):
    file_hash = hashlib.sha256()
    with open(filename, mode="rb") as f:
        chunk = f.read(buffer_size)

我們首先創(chuàng)建一個新的哈希對象,然后讀取一個 8 KB 的塊(通過將字節(jié)數(shù)傳遞給我們的文件對象的 read 方法)。

現(xiàn)在我們需要文件的其余部分。所以我們將循環(huán):

import hashlib
def get_sha256_hash(filename, buffer_size=2**10*8):
    file_hash = hashlib.sha256()
    with open(filename, mode="rb") as f:
        chunk = f.read(buffer_size)
        while chunk:
            file_hash.update(chunk)
            chunk = f.read(buffer_size)
    return file_hash.hexdigest()

我們重復讀取一個塊,更新我們的哈希對象,然后讀取另一個塊。

只要我們不在文件的末尾,我們就會在讀取時返回一個真實的塊。

但是當我們在文件的最后讀取時,我們會得到一個空字節(jié)字符串??兆止?jié)字符串(如空字符串)是錯誤的,因此在文件末尾我們將跳出循環(huán)。然后我們將像以前一樣返回十六進制摘要。

>>> get_sha256_hash("exercises.zip")
'9e98242a21760945ec815668fc79d8621fa15dd23659ea29be2c5949153fe96d'

但是,我們現(xiàn)在不是將整個文件讀入內存,而是逐塊讀取文件。

使用賦值表達式

在逐塊讀取文件時,通常會看到使用的賦值表達式(通過 Python 的海象運算符):

import hashlib
def get_sha256_hash(filename, buffer_size=2**10*8):
    file_hash = hashlib.sha256()
    with open(filename, mode="rb") as f:
        while chunk := f.read(buffer_size):
            file_hash.update(chunk)
    return file_hash.hexdigest()

在 while 循環(huán)中重復讀取數(shù)據(jù)是賦值表達式的一個很好的用例。它可能看起來有點奇怪,但它確實為我們節(jié)省了幾行代碼。

注意:海象運算符是在 Python 3.8 中添加的。

最后總結下,當你在 Python 中讀取二進制文件時,你會得到字節(jié),當你讀取一個大型二進制文件時,你需要逐塊讀取它,當然如果可以最好避免自己讀取二進制文件,有第三方庫可以使用第三方庫來處理。

相關文章

  • YOLOv5改進教程之添加注意力機制

    YOLOv5改進教程之添加注意力機制

    注意力機制最先被用在NLP領域,Attention就是為了讓模型認識到數(shù)據(jù)中哪一部分是最重要的,為它分配更大的權重,獲得更多的注意力在一些特征上,讓模型表現(xiàn)更好,這篇文章主要給大家介紹了關于YOLOv5改進教程之添加注意力機制的相關資料,需要的朋友可以參考下
    2022-06-06
  • python list格式數(shù)據(jù)excel導出方法

    python list格式數(shù)據(jù)excel導出方法

    今天小編就為大家分享一篇python list格式數(shù)據(jù)excel導出方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-10-10
  • Python輸入若干整數(shù)求和方式

    Python輸入若干整數(shù)求和方式

    這篇文章主要介紹了Python輸入若干整數(shù)求和方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • Flask學習之全局異常處理詳解

    Flask學習之全局異常處理詳解

    Flask是一個基于Python的Web框架,它提供了全局異常處理的機制來捕獲和處理應用程序中的異常,下面就帶大家深入了解一下Flask是如何實現(xiàn)異常處理的,希望對大家有所幫助
    2023-06-06
  • Python中的閉包總結

    Python中的閉包總結

    這篇文章主要介紹了Python中的閉包總結,本文講解了閉包的概念、為什么使用閉包、使用閉包實例等內容,需要的朋友可以參考下
    2014-09-09
  • Python 程序員必須掌握的日志記錄

    Python 程序員必須掌握的日志記錄

    這篇文章主要介紹了Python 日志的相關資料,幫助大家更好的理解和學習python,感興趣的朋友可以了解下
    2020-08-08
  • Python 使用with上下文實現(xiàn)計時功能

    Python 使用with上下文實現(xiàn)計時功能

    with 語句適用于對資源進行訪問的場合,確保不管使用過程中是否發(fā)生異常都會執(zhí)行必要的“清理”操作,釋放資源,比如文件使用后自動關閉、線程中鎖的自動獲取和釋放等。這篇文章主要介紹了Python 使用with上下文實現(xiàn)計時,需要的朋友可以參考下
    2018-03-03
  • Python unittest裝飾器實現(xiàn)原理及代碼

    Python unittest裝飾器實現(xiàn)原理及代碼

    這篇文章主要介紹了Python unittest裝飾器實現(xiàn)原理及代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-09-09
  • Pyinstaller打包工具的使用以及避坑

    Pyinstaller打包工具的使用以及避坑

    本文主要的是pyinstaller在windows下的基本使用和基礎避坑,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • python繪制字符畫視頻的示例代碼

    python繪制字符畫視頻的示例代碼

    網(wǎng)上有很多的字符畫,看起來很炫酷,本文就通過一則示例實現(xiàn)字符畫視頻,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-11-11

最新評論

剑阁县| 青浦区| 利津县| 滁州市| 临桂县| 修文县| 凤阳县| 象山县| 西宁市| 凤城市| 黎川县| 政和县| 林芝县| 松潘县| 炎陵县| 景德镇市| 安化县| 永胜县| 新兴县| 乐陵市| 永丰县| 荣成市| 莒南县| 黄大仙区| 彰化县| 班戈县| 禄丰县| 湖南省| 绥棱县| 银川市| 苍山县| 渭源县| 京山县| 清徐县| 泽普县| 鹿邑县| 吴桥县| 五指山市| 邹平县| 铜梁县| 青龙|