Python二进制文件直接从字符串写入

Posted

技术标签:

【中文标题】Python二进制文件直接从字符串写入【英文标题】:Python binary file write directly from string 【发布时间】:2017-11-29 21:23:42 【问题描述】:

我在一个字符串变量中有一个 png 文件的字节码。如何在没有 python 尝试对其进行编码的情况下将其写入 .png 文件?字符串是 '\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\n\x00\x00\x00\x07\x08\x02\x00\x00\x00\xbe \xceK4\x00\x00\x00\x01sRGB\x00\xae\xce\x1c\xe9\x00\x00\x00\x04gAMA\x00\x00\xb1\x8f\x0b\xfca\x05\x00\x00\x00\tpHYs \x00\x00\x0e\xc3\x00\x00\x0e\xc3\x01\xc7o\xa8d\x00\x00\x00DIDAT\x18Wc\xf8\xff\xff\xff\xaf\xfd\x07\xdf[:\xbc \x95Q\x81 \xfb\xc7\xaa\xb5@q \x00I#\xcb\xc1\x11D\x11H\xfa\xdb\x94\x19hr\x10\xf4NY\x1b$\x8d\x0c\x90\x95~\ xad\xacE\x97F\x03\x94H\xff\xff\x0f\x00\x1f]\xa2\x03U|Z\xa3\x00\x00\x00\x00IEND\xaeB`\x82'

编辑:我觉得您可能需要更多关于我的情况的信息:我正在尝试制作一个小加密程序,虽然它适用于字符串,但我也想让它适用于任何文件。我正在以字节模式读取 .png 文件(它给出了上面提到的字符串),在完成加密和解密后,我有一个内容完全相同的字符串,但无法将其放回文件中.

【问题讨论】:

以二进制模式打开文件(使用'wb'而不是'w') 你为什么不使用 bytes 对象,而不是 str,在 Python 3 中是 unicode 代码点序列。换句话说,你是如何创建这个str的? @JohnLaRooy 几乎可以肯定,OP 需要一个由 string 表示的字节对象。 IE。将通过在该字符串文字前加上 b 来创建的字节对象 谢谢约翰,不幸的是我试过了,没有用。 juanpa,我需要做一些事情,比如找到它的一部分等等,其中一些只能在字符串上。你知道有什么方法可以将字符串转换回原来的类型吗? 【参考方案1】:

您可以尝试使用 PyPNG,这似乎是一个可能的解决方案: http://pythonhosted.org/pypng/ex.html#writing

这将使您可以将二进制文件写入 python 中的文件。

with open('filename', 'wb') as f:
      f.write(bytecode) 

【讨论】:

这行不通。 f.write 将需要一个 bytes 对象,但 OP 有一个 str 是的忘了输入编码,我应该删除这个答案,因为它与上面的基本相同吗? @J.Clark 我认为这两者都不是 OP 想要的。 OP 想要将 字符串表示的字节 写入文件。如果您encode 它,它将更改字节。在我看来,OP 的根本问题是 为什么 这是在 str 而不是 bytes 对象中? @J.Clark,如果你愿意的话。感谢您的尝试【参考方案2】:

对于python3,您必须以二进制写入模式打开文件将字符串编码为字节:

with open('filename', 'wb') as f:
    f.write(the_string.encode())

【讨论】:

但是 encoding 正是 OP 想要避免的。 我虽然他的意思是没有 python 将字节(ascii)转换为 utf 字符,或者转义反斜杠 你认为.encode()是做什么的? 也就是说,你这里的操作本质上相当于以文本模式打开,直接写str 我试过在 wb 和 rb 模式下打开它,但这迫使我转换它。我从文件中读取了上面的字符串,作为 bytearray,但是我需要对它执行只能使用字符串的操作,但是有什么方法可以获取该字符串并将其恢复为以前的类型? @JeanDuPlessis 将其恢复为字节数组?

以上是关于Python二进制文件直接从字符串写入的主要内容,如果未能解决你的问题,请参考以下文章

c# 将字符串以二进制形式写入文件

怎么将内存buffer二进制数据直接写入/dev/mtd2

python实现读写txt文件

在 Python 中将二进制数据写入文件

Python文件使用“wb”方式打开,写入内容

如何在Windows命令提示符下从十六进制字符串写入二进制文件