python open读取文件,Python通过解释器内置的open()函数打开一个文件

  python open读取文件,Python通过解释器内置的open()函数打开一个文件

  本文主要介绍使用Python读取二进制文件。本文尝试使用Python中内置的open函数,使用默认的读取模式读取zip文件。下面有详细介绍,有需要的朋友可以参考一下。

  相信大家都很熟悉用python读取一个文本文件,但是如果我们遇到一个二进制文件要读取呢?我们尝试使用Python中内置的open函数,使用默认的读取模式来读取zip文件。抱歉,我们会收到一条错误消息:

  打开( exercises.zip )作为zip_file:

  .contents=zip_file.read()

  .

  回溯(最近呼叫):

  模块中文件 stdin 的第2行

  文件/usr/lib/python3.10/codecs.py ,de中的第322行

  密码

  (结果,消耗)=自我。_buffer_decode(数据、自身错误、最终)

  unicode decodedeerror : utf-8 编解码器无法解码位置11:无效sta中的字节0x8e

  rt字节

  我们收到一个错误,因为zip文件不是文本文件,它们是二进制文件。

  要从二进制文件中读取,我们需要使用模式 rb 而不是默认模式 rt 打开它:

  用open(exercises.zip ,mode=rb )作为zip_file:

  .contents=zip_file.read()

  当从二进制文件中读取时,我们不会得到字符串。将返回一个字节对象,也称为字节字符串:

  用open(exercises.zip ,mode=rb )作为zip_file:

  .contents=zip_file.read()

  .

  类型(内容)

  类字节

  目录[:20]

  b PK x03 x04 n x00 x00 x00 x00Y x8e x84T x00 x00 x00 x00 x00 x00

  他们在字节字符串中没有字符:.中有字节

  除非我们理解它们的意思,否则文件中的字节对我们帮助不大。

  使用库来读取二进制文件

  在处理二进制文件时,您通常会使用并知道如何处理正在使用的特定类型文件的库(内置Python库或第三方库)。这个库将完成将文件中的字节解码成更易于使用的字节的工作。

  例如,Python 的 ZipFile 模块可以帮助我们读取 zip 文件中的数据:

  从zipfile导入ZipFile

  使用ZipFile(exercises.zip )作为zip_file:

  .test _ file=zip _ file . read( exercises/test . py )。解码(“utf-8”)

  .

  测试文件[:30]

  #!/usr/bin/env python3nfrom __

  如果有人已经完成了这项工作,最好避免实现自己的字节检查或字节操作逻辑。

  在 Python 中以字节级别工作

  有时你会使用或被要求直接使用字节级库或API。在这种情况下,您至少需要了解一点二进制文件和字节字符串。

  例如,假设我们想要计算给定文件的sha256校验和。

  在这里,我们有一个名为 get_sha256_hash 的函数来执行此操作:

  导入hashlib

  def get_sha256_hash(文件名):

  用open(文件名,模式=rb )作为f:

  返回hashlib.sha256(f.read())。hexdigest()

  该功能

  读取此文件中的所有二进制数据。我们正在读取字节,因为 Python 的 hashlib 模块要求我们使用字节。hashlib 模块在底层工作:它使用字节而不是字符串。

  因此,我们传入文件中的所有字节以获取哈希对象,然后对该哈希对象调用 hexdigest 方法以获取表示该文件的 SHA-256 校验和的十六进制字符串:

  

>>> get_sha256_hash("exercises.zip")

 

  此功能运行良好,但使用此功能读取非常大的文件可能会出现问题。

  分块读取二进制文件

  我们的 get_sha256_hash 函数一次将整个文件读入内存。一个非常大的文件可能会占用大量内存。

  对于文本文件,解决此问题的常用方法是逐行读取文件。但是二进制文件不一定有行!但是,我们可以尝试逐块读取。

  首先,我们将从文件中读取一个 8 KB 的块:

  

import hashlib

 

  我们首先创建一个新的哈希对象,然后读取一个 8 KB 的块(通过将字节数传递给我们的文件对象的 read 方法)。

  现在我们需要文件的其余部分。所以我们将循环:

  

import hashlib

 

  我们重复读取一个块,更新我们的哈希对象,然后读取另一个块。

  只要我们不在文件的末尾,我们就会在读取时返回一个真实的块。

  但是当我们在文件的最后读取时,我们会得到一个空字节字符串。空字节字符串(如空字符串)是错误的,因此在文件末尾我们将跳出循环。然后我们将像以前一样返回十六进制摘要。

  

>>> get_sha256_hash("exercises.zip")

 

  但是,我们现在不是将整个文件读入内存,而是逐块读取文件。

  使用赋值表达式

  在逐块读取文件时,通常会看到使用的赋值表达式(通过 Python 的海象运算符):

  

import hashlib

 

  在 while 循环中重复读取数据是赋值表达式的一个很好的用例。它可能看起来有点奇怪,但它确实为我们节省了几行代码。

  

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

 

  

 

  最后总结下,当你在 Python 中读取二进制文件时,你会得到字节,当你读取一个大型二进制文件时,你需要逐块读取它,当然如果可以最好避免自己读取二进制文件,有第三方库可以使用第三方库来处理。

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: