当前位置: 首页 > 面试题库 >

Python编写二进制文件,字节

段渊
2023-03-14
问题内容

Python3。我使用QT的文件对话框小部件来保存从Internet下载的PDF。我一直在使用“
open”读取文件,并尝试使用“文件”对话框小部件来写入文件。但是,我一直遇到“
TypeError:’_io.BufferedReader’不支持缓冲区接口”错误。

示例代码:

with open('file_to_read.pdf', 'rb') as f1: 
    with open('file_to_save.pdf', 'wb') as f2:
        f2.write(f1)

当不使用’b’指示符时,或者在从Web读取文件(例如urllib或请求)时,此逻辑可以正确处理文本文件。这些是“字节”类型的,我认为我需要打开文件。相反,它以缓冲读取器的形式打开。我尝试了bytes(f1),但得到“
TypeError:’bytes’对象无法解释为整数”。有想法吗?


问题答案:

如果您只是想复制文件,则可以使用shutil

>>> import shutil
>>> shutil.copyfile('file_to_read.pdf','file_to_save.pdf')

或者,如果您需要按字节访问(类似于您的结构),则可以这样做:

>>> with open('/tmp/fin.pdf','rb') as f1:
...    with open('/tmp/test.pdf','wb') as f2:
...       while True:
...          b=f1.read(1)
...          if b: 
...             # process b if this is your intent   
...             n=f2.write(b)
...          else: break

但是逐字节可能 真的很慢

或者,如果您想要一个可以加快速度的缓冲区(不冒将未知文件大小完全读入内存的风险):

>>> with open('/tmp/fin.pdf','rb') as f1:
...    with open('/tmp/test.pdf','wb') as f2:
...       while True:
...          buf=f1.read(1024)
...          if buf: 
...              for byte in buf:
...                 pass    # process the bytes if this is what you want
...                         # make sure your changes are in buf
...              n=f2.write(buf)
...          else:
...              break

使用Python 2.7+或3.1+,您还可以使用此快捷方式(而不是使用两个with块):

with open('/tmp/fin.pdf','rb') as f1,open('/tmp/test.pdf','wb') as f2:
    ...


 类似资料:
  • 问题内容: 我使用python 3,我尝试将二进制文件写入使用r + b的文件。 其中,binary是包含数字的列表。如何将其写入二进制文件? 最终文件必须看起来像b’x07 \ x08 \ x07 \ 谢谢 问题答案: 当您以二进制模式打开文件时,实际上就是在使用该类型。因此,当您写入文件时,您需要传递一个对象,而从文件中读取时,您将获得一个对象。相反,以文本模式打开文件时,您正在使用对象。 因

  • 问题内容: 我有一个字节列表作为整数,这类似于 如何将此列表作为二进制文件写入文件? 这行得通吗? 问题答案: 这正是用于: 如果您使用的是Python 3.x,则可以改用(也许应该这样做,因为它可以更好地表明您的意图)。但是在Python 2.x中,这是行不通的,因为它只是的别名。像往常一样,使用交互式解释器进行显示比使用文本进行解释要容易,所以让我这样做。 Python 3.x: Python

  • 问题内容: 我从事Web编程已经有几年了,自那时以来,我还没有为桌面应用程序做任何编程,而且我已经忘记了很多事情。如果这太简单,请耐心等待。 现在我有这种情况: 我正在尝试将一些散列字存储在文件中。我想我应该为此使用二进制文件(如果我错了,请纠正我)。但是我不知道如何将单词写到文件中。我尝试了很多方法,但是当我读回文件并尝试解密单词时,我得到了。 有谁知道如何将单词写到文件中? PS:我使用以下代

  • 问题内容: 我有23位表示为字符串,并且需要将此字符串作为4个字节写入二进制文件。最后一个字节始终为0。以下代码有效(Python 3.3),但感觉不太好(我对Python和编程很陌生)。您有任何改善技巧吗?似乎for循环可能有用,但是如何在循环中进行切片而不出现IndexError?请注意,当我将位提取到一个字节中时,我会反转位顺序。 问题答案: 您可以将其视为int,然后按以下方式创建4个字节

  • 我想以这种形式将短int x=0x4740写入二进制文件:0100 0000 0100 0111,当我在记事本中打开它时,它是@G。它正在工作。当我尝试编写例如短int a=0xf0ff;(二进制:1111 0000 1111 1111)时,记事本显示给我的不是我的数字二进制(➕是1100 1011 1001 1001 1100 0100 1001 0001)。如何在这个文件中编写它并获得1111

  • Python 不仅支持文本文件的读写,也支持二进制文件的读写,比如图片,声音文件等。 读取二进制文件 读取二进制文件使用 ‘rb’ 模式。 这里以图片为例: with open('test.png', 'rb') as f: image_data = f.read() # image_data 是字节字符串格式的,而不是文本字符串 这里需要注意的是,在读取二进制数据时,返回的数据是字

  • 我想编程一个16/32位的EEPROM。我正在用C程序编写这个文件,但是似乎只执行8位?我写了一个简单的例子,使用xxd(和hextump)查看结果,但文件似乎只有8位。我想知道是否由于hexdump的限制,我只能看到8位 有人知道我如何检查所有的位都被写入文件吗? 使用xxd我看到: 编辑:我试图确保有32位写入文件。xxd的结果是: 其中显示有16位用于,但其他16位在哪里?理想情况下,我希望

  • 问题内容: 我发现用Python读取二进制文件特别困难。你能帮我个忙吗?我需要读取此文件,在Fortran 90中,该文件很容易被读取 详细而言,文件格式为: 如何使用Python阅读?我尝试了一切,但没有成功。我是否有可能在python中使用f90程序,读取此二进制文件,然后保存需要使用的数据? 问题答案: 读取二进制文件内容,如下所示: 然后使用struct.unpack “解压缩”二进制数据