我对此坚持了太久了。我试图对从请求中收到的字节对象进行解码。当我尝试解码为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)
答案 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\n
。 This 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')