Python 3 编码时不拆分字符串

Python 3 does not split strings when encoded

这是片段:

for eachLine in content.splitlines(True):
    entity = str(eachLine.encode("utf-8"))[1:]
    splitResa = entity.split('\t')
    print(entity)
    print(splitResa)

基本上我得到这个结果:

'<!ENTITY DOCUMENT_STATUS\t\t\t\t\t"draft">\n'
['\'<!ENTITY DOCUMENT_STATUS\t\t\t\t\t"draft">\n\'']

然而在 IDLE 中一切正常:

>>> '<!ENTITY DOCUMENT_STATUS\t\t\t\t\t"draft">\n'.split('\t')
['<!ENTITY DOCUMENT_STATUS', '', '', '', '', '"draft">\n']

不明白为什么。我也在这里尝试过答案: splitting a string based on tab in the file 但它仍然执行相同的行为。这里有什么问题?

看起来 eachLine 是原始字符串。

>>> r'<!ENTITY DOCUMENT_STATUS\t\t\t\t\t"draft">\n'.split('\t')
['<!ENTITY DOCUMENT_STATUS\t\t\t\t\t"draft">\n']

因此,您应该将其与原始 \t (r'\t') 拆分,就像这样

>>> r'<!ENTITY DOCUMENT_STATUS\t\t\t\t\t"draft">\n'.split(r'\t')
['<!ENTITY DOCUMENT_STATUS', '', '', '', '', '"draft">\n']

或正确转义 \t ('\t'),像这样

>>> r'<!ENTITY DOCUMENT_STATUS\t\t\t\t\t"draft">\n'.split('\t')
['<!ENTITY DOCUMENT_STATUS', '', '', '', '', '"draft">\n']

您制作了bytes表示;您在此处破坏了 repr() 调试输出。任何不可打印或特殊字符都将替换为它们的转义序列。您生成的输出在字符串中没有制表符,它包含两个字符 \t:

的序列
>>> '\t'
'\t'
>>> '\t'.encode('utf8')
b'\t'
>>> str('\t'.encode('utf8'))
"b'\t'"
>>> str('\t'.encode('utf8'))[1:]
"'\t'"
>>> str('\t'.encode('utf8'))[1:][1:-1]
'\t'
>>> len(str('\t'.encode('utf8'))[1:][1:-1])
2

我不清楚为什么要先将文本编码为字节,然后再转换回字符串。一般来说,你不想那样做。

在 IDLE 中,您没有产生这种损坏的输出;您只有一个带有实际制表符的常规字符串,因此可以拆分这些制表符。我在这里唯一的建议是不要在此处编码为字节