在python 3.6中将字节转换为字符串

时间:2017-06-29 16:58:41

标签: python python-2.7 python-3.x encoding byte

我正在尝试阅读和处理文件。这在Python2.7中完全没问题,但是我无法在Python 3中使用它。 在Python 2.7中,它可以在不提供任何编码的情况下工作,而在Python 3中,我尝试了所有使用和不使用编码的组合。

深潜后,我发现read返回的内容在两个版本中都有所不同。

Python 2.7中的代码有效:

>>> f = open('resource.cgn', 'r')
>>> content = f.read()
>>> type(content)
<type 'str'>
>>> content[0:20]
'\x04#lwq \x7f`g \xa0\x03\xa3,ess to'
>>> content[0]
'\x04'

但是在Python 3中:

>>> f = open('resource.cgn','r')
>>> content = f.read()
Traceback (most recent call last):
  File "<console>", line 1, in <module>
  File "/usr/local/lib/python3.6/encodings/ascii.py", line 26, in decode
    return codecs.ascii_decode(input, self.errors)[0]
  UnicodeDecodeError: 'ascii' codec cant decode byte 0xa0 in position 10: ordinal not in range(128)
>>> f = open('resource.cgn','rb')
>>> content = f.read()
>>> type(content)                   
<class 'bytes'>
>>> content[0:20]
b'\x04#lwq \x7f`g \xa0\x03\xa3,ess to'
>>> content[0]
4
>>> content.decode('utf8')
Traceback (most recent call last):
  File "<console>", line 1, in <module>
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xa0 in position 10: 
invalid start byte

我想获得与Python 2.7相同的输出。 content类型应为stringcontent[0]应为str '\x04'而不是4

关于如何获得这个的任何指示?我试过编码没有任何成功。

1 个答案:

答案 0 :(得分:1)

3.X&#39; s str默认为2.X&#39; unicode默认情况下以文本模式打开文件对象3.X尝试解码和编码文件分别读取或写入。 2.X的str现在是3.X中的bytes。 3.X bytes和2.X&#39; str之间存在非常小的差异,两者基本上都包含8位文本。

这是在3.X中将b'\x04#lwq \x7f`g \xa0\x03\xa3,ess to'转换为str的简单方法:

>>> content = ''.join(chr(x) for x in b'\x04#lwq \x7f`g \xa0\x03\xa3,ess to')
>>> content
'\x04#lwq \x7f`g \xa0\x03£,ess to'
>>> content[0]
'\x04

解码bytes字符串失败,因为您的UTF-8字符字节无效,ASCII相同。

但是,明智的做法是提及bytes用于处理二进制数据,而str仅用于3.X中的Unicode字符串。然后建议在3.X中使用bytes代替str二进制字符串:

>>> content = b'\x04#lwq \x7f`g \xa0\x03\xa3,ess to'
>>> hex(content[0])
'0x4'