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