【问题标题】:Check if a byte string ends with a special character with Python用 Python 检查字节字符串是否以特殊字符结尾
【发布时间】:2018-01-05 12:58:45
【问题描述】:

我正在使用 Python 3.6 解析一个包含一些 UTF-8 编码文本的 XML 文件:

<line>
  <text>Some text which could end with ¬</text>
</line>

我用xml.etree.ElementTree 解析它,我得到text 元素作为一个元素:

<Element 'text' at 0x105577c78>

我可以得到文本字符串

text_string = text.text.encode('utf-8')
msg = "Text string: {}".format(text_string)
self.stdout.write(self.style.SUCCESS(msg))

我得到:

Text string: b'Some text which could end with \xac'

现在我需要知道这个字符串是否以 ¬ 字符结尾:

if text_string.endswith('¬'):
    print("The text ends which the char!")

但我明白了:

TypeError: endswith first arg must be bytes or a tuple of bytes, not str

如果我更改为if text_string.endswith(b'¬'):,我会收到另一个错误:

    if text_string.endswith(b'\xac'):
                           ^
SyntaxError: bytes can only contain ASCII literal characters.

我知道我很困惑,因为 text_string 是字节而不是字符串,但我不明白如何解决我的问题。

如何将字节转换为字符串? 或者如何在字节对象中搜索特殊字符?

谢谢!

【问题讨论】:

  • if text_string.endswith(b'\xac'): - eval.in/931046
  • 您应该检查具有相同编码的字符串 --- if text_string.endswith('¬'.encode('utf-8')):
  • “所有字符都是特殊的。” -- tchrist

标签: python python-3.x encoding utf-8


【解决方案1】:

谢谢!

在 cmets 工作中的两个建议:

if text_string.endswith(b'\xac'):
if text_string.endswith('¬'.encode('utf-8')):

【讨论】:

    【解决方案2】:

    对于 Python 2.7,如果没有给出其他编码提示,则默认为 ASCII 编码。看到这个PEP documentation

    所以,如果您使用的是 Python 2.7,请将以下注释放在程序脚本的顶部,那么一切都应该正常工作。

    # -*- coding: utf-8 -*-
    

    对于 Python 3.x,默认为 UTF-8 编码,因此您需要更改以下内容:

    发件人:

    text_string = text.text.encode('utf-8')
    

    收件人:

    text_string = text.text
    

    希望这会有所帮助。

    【讨论】:

    • 他们没有在 Python 3 中将其更改为默认为 UTF-8 吗?
    • Mark Ransom,在快速搜索文档后,我认为您是正确的。 Python 3.x 似乎默认为 UTF-8。我将相应地编辑我上面的评论。很想知道为什么原始帖子在 3.x 版本中不起作用。
    • 我认为错误信息是不言自明的:字节只能包含 ASCII 文字字符。现在为什么不允许使用非 ASCII,我不知道,这对我来说似乎是一个非常武断的决定。
    • 弄清楚为什么原始帖子在 3.x 中不起作用。由于编码已经是 UTF-8,encode 函数将变量从 更改为 。再次编辑我的帖子以合并解决方案。感谢 Mark Ransom 的抽查,结果是产生了更好的答案。
    猜你喜欢
    • 2012-03-22
    • 1970-01-01
    • 1970-01-01
    • 2010-12-20
    • 1970-01-01
    • 2014-11-25
    • 1970-01-01
    • 2022-08-11
    • 2020-03-15
    相关资源
    最近更新 更多