Python 3.x 如何以二进制模式将字节保存到文件
我有一个类似字节的对象,类似于:Python 3.x 如何以二进制模式将字节保存到文件,python-3.x,codec,Python 3.x,Codec,我有一个类似字节的对象,类似于: aa = b'abc\u6df7\u5408def.mp3' 我想以二进制模式将其保存到文件中。代码如下所示,但不起作用 if __name__=="__main__": aa = b'abc\u6df7\u5408def.mp3' print(aa.decode('unicode-escape')) with open('database.bin', "wb") as datafile: datafile.write
aa = b'abc\u6df7\u5408def.mp3'
我想以二进制模式将其保存到文件中。代码如下所示,但不起作用
if __name__=="__main__":
aa = b'abc\u6df7\u5408def.mp3'
print(aa.decode('unicode-escape'))
with open('database.bin', "wb") as datafile:
datafile.write(aa)
文件中的数据如下所示:
但我希望正确的格式是这样的,二进制数据中的Unicode:
如何转换字节以将其保存在文件中?
\unnn
转义在字节字符串中没有意义,因为它们没有指定字节序列。Unicode代码点在概念上是字符串的抽象表示,不能直接映射到序列化格式(由字节组成,或者原则上是任何其他类型的具体符号表示)
Unicode有定义良好的序列化格式;这些被称为“编码”。您似乎正在寻找这些字符的UTF-16大端编码
aa = 'abc\u6df7\u5408def.mp3'.encode('utf-16-be')
有了这些,我相信您的代码的其余部分应该可以像预期的那样工作
磁盘上的Unicode总是被编码的,但是为了正确地读取它,您显然必须知道编码。有时在序列化的Unicode文本文件的开头写入一个可选字符,以帮助读者发现编码;这是一个单一的非打印字符,其唯一目的是帮助消除编码的歧义,特别是其字节顺序(大端和小端)
然而,许多地方正在标准化UTF-8,它不需要BOM。编码本身是面向字节的,因此不受字节顺序问题的影响。也许还可以参见第一步,我们可以将aa转换为bb=b'abc\\xf7\\x6d\\x08\\x54def.mp3',然后是datafile.write(bb)。但如何做到这一点呢?你的投入并不是你所希望的。似乎希望
aa='abc\u6df7\u5408def.mpi'.encode('utf-8')
初始化字节字符串。字节字符串b\\u'
只是b'\\'
(反斜杠)后跟b'u'
(带小写字母的字节字符串u
)。将aa更改为aa=b'abc\u6df7\u5408def.mp3',问题仍然存在。不,字节字符串中的\u
定义不明确。如果您想要Unicode字符串的UTF-8编码,您必须这么说。实际上,您似乎想要UTF-16be
,但其余部分仍然适用。