【问题标题】:How to read interpreted data strings in Python?如何在 Python 中读取解释的数据字符串?
【发布时间】:2015-09-18 22:14:26
【问题描述】:

我想从 Python 文件中读取所有字符串。示例文件(/tmp/s.py):

s = '{\x7f5  x'

现在我尝试从脚本中读取字符串:

import re
find_str = re.compile(r"'(.+?)'")

for line in open('/tmp/s.py', 'r'):
    all_strings = find_str.findall(line)
    print(all_strings) # outputs ['{\\x7f5  x']

但我希望字符串(在这种情况下是转义的十六进制表示中的字节)不被转义。我想处理位于我的 /tmp/s.py 文件中的数据,并获取一个带有解释的 \x7f 字节的字符串,而不是现在表示为 \\x7f 的文字 \x7f。

我该怎么做?

【问题讨论】:

    标签: python hex byte


    【解决方案1】:

    您可以使用unicode_escape 编解码器来解码字符串,就像 Python 在读取字符串文字时所做的那样:

    print(*[s.encode('latin1').decode('unicode_escape') for s in all_strings])
    

    注意unicode_escape 只能从字节解码,不能从文本解码。编解码器也仅限于 Latin-1 源代码,而不是默认的 UTF-8。

    来自 Python codecs 模块的 Text Encodings section

    unicode_escape

    编码适合作为 ASCII 编码 Python 源代码中的 Unicode 文字的内容,但引号不会被转义。从 Latin-1 源代码解码。请注意,Python 源代码实际上默认使用 UTF-8。

    演示:

    >>> s = r'{\x7f5  x'
    >>> s
    '{\\x7f5  x'
    >>> s.encode('latin1').decode('unicode_escape')
    '{\x7f5  x'
    

    【讨论】:

    • 这是一个非常好的答案,并且准确地回答了我试图制定的内容。非常感谢。知道为什么 Python 开发人员更喜欢 latin1 而不是 utf8,而 Python 源代码默认为 utf8 吗?
    • @NikolaiTschacher:我怀疑这个限制是历史性的; Python 2 源代码传统上也被解释为 Latin-1。此外,Latin-1 意味着您的字节被一对一地解码为 Unicode 代码点,这在处理任意字符串时可能是更好的选择(您始终可以将所有字节解码为 Unicode 代码点,即使它是错误的) .您无法在此处指定源编码,因为您已经选择了 unicode_escape 编解码器。
    猜你喜欢
    • 2023-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-05
    相关资源
    最近更新 更多