如何将字节转换为字符串值

时间:2018-08-05 00:03:39

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

我对此坚持了太久了。我试图对从请求中收到的字节对象进行解码。当我尝试解码为UTF-8并打印时,看不到字节对象的字符串表示形式。我在这里想念什么?

import urllib.request

url = 'https://www2.census.gov/geo/docs/reference/codes/files/national_cousub.txt'

data = urllib.request.urlopen(url)

counter = 0
for line in data:

    print('byte string:')
    print(line)
    print('after decoding:')
    print(line.decode('utf-8'))

    counter = counter + 1
    if counter > 5:
        break

这是我在控制台上看到的:

byte string:
b'STATE,STATEFP,COUNTYFP,COUNTYNAME,COUSUBFP,COUSUBNAME,FUNCSTAT\r\r\n'
after decoding:


byte string:
b'AL,01,001,Autauga County,90171,Autaugaville CCD,S\r\r\n'
after decoding:


byte string:
b'AL,01,001,Autauga County,90315,Billingsley CCD,S\r\r\n'
after decoding:


byte string:
b'AL,01,001,Autauga County,92106,Marbury CCD,S\r\r\n'
after decoding:


byte string:
b'AL,01,001,Autauga County,92628,Prattville CCD,S\r\r\n'
after decoding:


byte string:
b'AL,01,003,Baldwin County,90207,Bay Minette CCD,S\r\r\n'
after decoding:

我在Windows 10上。Python版本3.5.5。我通过蟒蛇安装python。我正在PyCharm中运行它。

sys.stdout.encoding ='UTF-8'

print(line.decode('utf-8'), file=sys.stderr)

的结果相同

1 个答案:

答案 0 :(得分:3)

您的所有字符串均以var players = [] $('.inner').each(function() { players.push({ player: new Vimeo.Player($(this).find("iframe").get(0)), top: $(this).position().top, status: "paused" }) }); var viewportHeight = $(window).height(); $(window).on('scroll', function() { var scrollPos = $(window).scrollTop(); for(var i=0; i<players.length;i++) { var elementFromTop = players[i].top - scrollPos; var status = (elementFromTop > 0 && elementFromTop < players[i].top + viewportHeight) ? "play" : "pause"; if(players[i].status != status) { players[i].status = status; players[i].player[status](); console.log(i, status); } } }); 结尾。这是错误的,但是(a)不是您的错,而是普查网站的错,并且(b)不应造成此问题。

假设您使用的是Windows,末尾的\r\r\n是换行符。但是前面没有\r\n的多余\r是回车符,它将光标移回当前行的开头。然后打印\n换行符将覆盖该行的其余部分。

最后一部分是不应该发生的。打印换行符应该只移动到下一行。通过在Windows命令行,macOS或Linux终端或on repl.it中运行此程序,您可以看到这一点。

但是您正在PyCharm中运行,输出将输出到PyCharm调试控制台。 PyCharm调试控制台无法像完整的终端仿真器那样工作,并且其中的一个区别显然是,它奇怪地处理\r\nThis question对此有更多信息。 (同样,在其他JetBrains IDE中也会发生同样的事情,就像您期望的那样,在IntelliJ中使用Java打印相同的文本。)

似乎没有调试控制台的修复程序;这就是它的工作原理。

您可以将输出发送到PyCharm的终端输出而不是其调试窗口,或者在其终端中运行该程序,或者使用Windows命令提示符而不是PyCharm或使用其他IDE ...,但是所有这些都意味着您不能使用PyCharm调试控制台进行调试,这可能不值得权衡。

如果您想在不更改设置的情况下解决此问题,最简单的解决方案是删除多余的\r字符:

\r

或者,更好的是,如aldo在评论中所建议的那样,调用print(line.decode('utf-8').replace('\r\r\n', \r\n')) strip删除所有那些类似换行符的字符。如果您希望该行以正确的换行符结尾(因此您仍会在每行之后得到一个空白行):

rstrip

如果不这样做,它甚至更简单:

print(line.decode('utf-8').rstrip()+'\n')