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

标签 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。我通过 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 在评论中的建议,调用 striprstrip 来删除所有这些换行符。如果您希望该行以正确的换行符结束(这样您在每行之后仍然会得到一个空行):

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

如果你不这样做,那就更简单了:

print(line.decode('utf-8').rstrip())

关于python - 如何将字节值转换为字符串值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51690465/

相关文章:

python - Pandas 报告系列在小数时是一个对象

python - 在 Python 3 中从字符串创建 Python 对象

python - 为什么我在 python 上收到列表对象不可调用错误?

java - 是否有任何正确的解决方案来获取和保存印地语字符并将这些字符显示到 jsp 页面?

php - 如何在 UTF-8 中使用 ctype_alpha

python - rejson=py 示例不适用于 python 3.6

python - 基础强化学习的折扣奖励

python-3.x - PngImageFile 类型的对象不可 JSON 序列化

ruby 1.9 : Convert byte array to string with multibyte UTF-8 characters

python - 为什么多个进程在python中具有相同的对象ID