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二进制文件直接从字符串写入的主要内容,如果未能解决你的问题,请参考以下文章