【问题标题】:python3 the way to write string into file in its entiretypython3将字符串完整写入文件的方式
【发布时间】:2017-08-07 12:33:19
【问题描述】:

我是 Python3 的新手。 我在将字符串写入文件时遇到问题。

以下字符串是我尝试写入文件的内容。

ÀH \x10\x08\x81\x00(十六进制,c04820108810)

当我使用xxd 命令检查文件时,我可以检查字符串和文件之间是否存在差异。

00000000: c380 4820 1008 c281 00                   ..H .....

这是我写的代码。

s = 'ÀH \x10\x08\x81\x00'
with open('test', 'w') as f:
    f.write(s)

问题是如何将这个字符串完整地写入文件。

【问题讨论】:

  • 你想把它写成二进制吗?然后使用bytes,而不是strs = b'ÀH \x10\x08\x81\x00'

标签: python-3.x file writing


【解决方案1】:

您似乎想写入二进制数据。在这种情况下,您应该使用bytes 类型而不是str,因为这可以让您完全控制序列的二进制内容。

在处理字符串时,您必须考虑到 Python 在内部将所有内容都以 UTF-8 格式处理,因此当您输入 À 之类的内容时,文件编码将决定实际输入的内容。你总是可以encode() 一个字符串来查看它的字节:

>>> 'ÀH \x10\x08\x81\x00'.encode()
b'\xc3\x80H \x10\x08\xc2\x81\x00'

您可以使用binascii 模块将其转换为十六进制,以获得这些字节的更易读的十六进制字符串:

>>> binascii.hexlify('ÀH \x10\x08\x81\x00'.encode())
b'c38048201008c28100'

如您所见,这与写入文件的内容相同。所以 Python 已经做了正确的事情。只是输入不是你想要的。

因此,改为使用字节字符串并以二进制模式写入文件:

# use a bytes string
s = b'\xc0\x48\x20\x10\x88\x10'

# open the file in binary mode
with open('test', 'bw') as f:
    f.write(s)

顺便说一句。如果您从头开始查看编码字符串,您已经可以看到当您输入该字符串时,您想到的编码与 Python 不同。您期望À 是二进制的0xc0,这在某种程度上是正确的,因为它的Latin-1 表示。但是当你 lookup its other representations 时,你可以看到在 Python 默认使用的 UTF-8 中,它是 0xc380——这也是我们在 Python 中编码时得到的值。

【讨论】:

  • 字符串不是静态的。在这种情况下,字符串只是偶然显示为 Latin-1 表示。如果它是动态的,如何将字符串转换为 b'\xc0\x48\x20\x10\x88\x10' 之类的字节?
  • 我在答案中向您展示了,您可以在字符串上调用.encode() 将其转换为字节字符串。如果您不想使用 UTF-8,也可以指定不同的编码,例如'ÀH \x10\x08\x81\x00'.encode('latin-1')。但这一切都取决于您的输入来自哪里。如果你真的在这里处理二进制文件,它不应该在解码的字符串中。
  • 我明白了。非常感谢。你的回答和cmets对我真的很有帮助。
【解决方案2】:

您必须将编码样式设置为 utf-8 并使用原始字符串,因为您有 \ 转义字符。因此,添加编码样式并将 r 放在您的字符串之前以使其原始。

# -*- coding: utf-8 -*-
s = r'ÀH \x10\x08\x81\x00'
with open('test.txt', 'w') as f:
    f.write(s)

【讨论】:

  • Python 3默认已经是UTF-8了,不需要指定文件编码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-07-09
  • 2021-04-11
  • 2023-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-24
相关资源
最近更新 更多