【问题标题】:Writing raw bytes to a file in Python3 results in unexpected output在 Python3 中将原始字节写入文件会导致意外输出
【发布时间】:2016-04-04 05:53:45
【问题描述】:

所以,我有这段代码:

f = open("crash.txt", "w")
junk = ("\xCC" * 1028)
f.write(junk)
f.close()

当我在 Windows(3.5.1) 上运行它时,我得到一个文件,其中包含重复的“CC”作为十六进制字符。这和预期的一样。

但是,在 Linux(Python 3.4.2) 上运行它时,我得到重复的“c38c”作为十六进制字符。

我不明白 Linux 上的输出。为什么会发生这种情况,我该如何解决。

【问题讨论】:

  • c38c 十六进制是什么意思?你的意思是\xc3\x8c
  • @Reti43 是的。当我在十六进制编辑器中查看文件的内容时。

标签: python python-3.x file-io byte


【解决方案1】:

您没有写入原始字节。默认情况下,Python 3 使用 Unicode 字符串,并且必须对这些字符串进行编码才能将它们写入文件。同样默认情况下,open() 使用文本模式,用于对文本进行编码的编码是 locale.getpreferredencoding()。在美国 Windows 上是 cp1252,但在 Linux 上通常是 utf8

b'\xc3\x8c' 是在utf8 中编码的'\xcc'

b'\xcc' 是在cp1252 中编码的'\xcc'

以二进制模式打开文件并写入字节字符串而不是 Unicode 来写入“原始”字节。

with open("crash.txt", "wb") as f:
    junk = b"\xCC" * 1028
    f.write(junk)

【讨论】:

  • @Mark Tolonen 我正在尝试将字节类型变量写入文件。有什么建议吗?
猜你喜欢
  • 2018-11-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-11
  • 2020-03-03
  • 2021-04-18
相关资源
最近更新 更多