Python 3 TypeError:必须为str,而不是sys.stdout.write()的字节

Python 3 TypeError:必须为str,而不是sys.stdout.write()的字节,第1张

Python 3 TypeError:必须为str,而不是sys.stdout.write()的字节

Python
3处理字符串有些不同。最初,字符串只有一种类型

str
。上世纪90年代,当unipre获得关注时,新
unipre
类型被添加为处理Unipre而不会破坏现有代码1。这实际上
str
与多字节支持相同。

在Python 3中,有两种不同的类型:

  • bytes
    类型。这只是一个字节序列,Python对如何将其解释为字符一无所知。
  • str
    类型。这也是一个字节序列, 但是Python知道如何将那些字节解释为字符
  • 单独的
    unipre
    类型已删除。
    str
    现在支持unipre。

在Python 2中,隐式地假设编码可能会导致很多问题。您可能最终使用了错误的编码,或者数据可能根本没有编码(例如,它是PNG图像)。
明确告诉Python使用哪种编码(或明确告诉其猜测)通常会好很多,并且更符合“明确优于隐含”的“
Python哲学”。

这一更改与Python 2不兼容,因为许多返回值已更改,从而导致了诸如此类的细微问题。这可能是采用Python
3的速度如此缓慢的主要原因。由于Python没有静态类型2, 因此无法通过脚本(例如捆绑的

2to3
)自动更改此 类型。

  • 您可以转换
    str
    bytes
    使用
    bytes('h€llo', 'utf-8')
    ; 这应该产生
    b'Hxe2x82xacllo'
    。请注意如何将一个字符转换为三个字节。
  • 您可以转换
    bytes
    str
    使用
    b'Hxe2x82xacllo'.depre('utf-8')

当然,UTF-8可能不是您所用的正确字符集,因此请确保使用正确的字符集。

在特定的一段代码,

nextline
是一个类型
bytes
,而不是
str
,阅读
stdout
以及
stdin
subprocess
来自在Python3改
str
bytes
。这是因为Python无法确定它使用哪种编码。它 可能
使用与
sys.stdin.encoding
(您的系统的编码)相同的语言,但是不能确定。

您需要更换:

sys.stdout.write(nextline)

与:

sys.stdout.write(nextline.depre('utf-8'))

或许:

sys.stdout.write(nextline.depre(sys.stdout.encoding))

您还需要修改

if nextline == ''
if nextline == b''

>>> '' == b''False

另请参阅Python 3 ChangeLog,PEP
358和PEP
3112。


1使用ASCII可以完成一些巧妙的技巧,而使用多字节字符集则无法做到;最著名的例子是“带有空格的xor切换大小写”(例如

chr(ord('a') ^ord(' ')) == 'A'
)和“设置第6位以构成控制字符”(例如
ord('t') + ord('@') ==ord('I')
)。ASCII是在 *** 纵单个位是对性能的影响不可忽略的时候设计的。

2是的,您可以使用功能注释,但这是一个相对较新的功能,很少使用。



欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5646728.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-16
下一篇 2022-12-16

发表评论

登录后才能评论

评论列表(0条)

保存