我已经在这个问题上坚持太久了。我尝试解码从请求接收到的字节对象。当我尝试解码为 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。我通过 anaconda 安装 python。我在 PyCharm 中运行它。
sys.stdout.encoding
= 'UTF-8'
与 print(line.decode('utf-8'), file=sys.stderr) 的结果相同
最佳答案
您的字符串均以 \r\r\n
结尾。这是错误的,但是 (a) 这不是您的错,而是人口普查网站的错,并且 (b) 它不应该导致此问题。
假设您使用的是 Windows,末尾的 \r\n
是一个普通的换行符。但前面额外的 \r
(没有 \n
)是一个回车符,可将光标移回当前行的开头。然后打印 \r\n
换行符会覆盖该行的其余部分。
最后一部分是不应该发生的。打印换行符应该只移动到下一行。您可以通过在 Windows 命令行、macOS 或 Linux 终端或 on repl.it 中运行此程序来看到这一点。 .
但是您正在 PyCharm 中运行,输出将发送到 PyCharm 调试控制台。 PyCharm 调试控制台的工作方式与完整的终端仿真器不同,显然,其中一个差异是它对 \r
的处理方式很奇怪。 This question有更多相关信息。 (同样的事情也会发生在其他 JetBrains IDE 中,例如在 IntelliJ 中使用 Java 打印相同的文本,正如您所期望的那样。)
调试控制台似乎没有修复;这就是它的工作原理。
您可以将输出发送到 PyCharm 的终端输出而不是调试窗口,或者在终端中运行程序,或者使用 Windows 命令提示符而不是 PyCharm,或者使用不同的 IDE……但所有这些都意味着您不能使用 PyCharm 调试控制台进行调试,这可能不是值得进行的权衡。
如果您想在不更改设置的情况下解决问题,最简单的解决方案是删除那些额外的 \r
字符:
print(line.decode('utf-8').replace('\r\r\n', \r\n'))
或者,更好的是,按照 aldo 在评论中的建议,调用 strip
或 rstrip
来删除所有这些换行符。如果您希望该行以正确的换行符结束(这样您在每行之后仍然会得到一个空行):
print(line.decode('utf-8').rstrip()+'\n')
如果你不这样做,那就更简单了:
print(line.decode('utf-8').rstrip())
关于python - 如何将字节值转换为字符串值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51690465/