从文件缓冲区实例读取时出错



我正在尝试从强力球中奖号码文件中读取:http://www.powerball.com/powerball/winnums-text.txt

正在尝试逐行获取它,我有以下代码:

import urllib.request
with urllib.request.urlopen("http://www.powerball.com/powerball/winnums-text.txt") as file:
    next(file)
    for line in file:
        line.lstrip("b'")
        line.rstrip(" rn'")
        print(line)

文件中的每一行都打印如下:

b'12/06/1997  15  26  28  08  43  36  rn'
b'12/03/1997  18  09  14  47  42  32  rn'
b'11/29/1997  11  27  13  02  31  23  rn'
b'11/26/1997  15  46  34  23  40  35  rn'
b'11/22/1997  22  31  03  07  14  02  rn'

我收到错误:

File "powerball.py", line 5, in <module>
    line.lstrip("b'")
TypeError: 'str' does not support the buffer interface

我试图摆脱多余的字符并使行如下所示:

12/06/1997  15  26  28  08  43  36

我该如何解决这个问题?

正如有人已经提到的,该文件正在以二进制模式读取。您需要将字符串转换为文本编码格式。您可以通过以下方式解决此问题:

line = line.decode("utf-8","ignore")

这应该会给你期望的行为。

强烈建议对这种 IO 使用 pandas,它将在一行代码中处理 http 请求、解析和所有内容;作为奖励,您也可以将其用于数据分析:

import pandas as pd
df = pd.read_csv('http://www.powerball.com/powerball/winnums-text.txt')
print(df)
     Draw Date   WB1 WB2 WB3 WB4 WB5 PB  PP
0     02/24/2016  67  21  65  31  64  05  3
1     02/20/2016  54  12  11  16  15  25  5
2     02/17/2016  29  27  07  40  17  25  2
3     02/13/2016  07  15  36  18  19  20  2
4     02/10/2016  02  62  40  50  03  05  2
5     02/06/2016  13  04  36  31  52  08  3
6     02/03/2016  26  60  67  31  28  23  3
7     01/30/2016  16  05  12  31  43  18  4
8     01/27/2016  40  52  03  67  12  21  2
9     01/23/2016  32  22  40  69  34  19  4
10    01/20/2016  44  05  39  69  47  24  5
11    01/16/2016  61  52  51  64  03  06  2

line是一个字节序列,而不是一个字符串。使用 str 函数将其转换为字符串。

import urllib.request
with urllib.request.urlopen("http://www.powerball.com/powerball/winnums-text.txt") as file:
    next(file)
    for bline in file:
        line = str(bline, "utf-8")
        print(line)
for line in file:
    line.lstrip("b'")
    line.rstrip(" rn'")
    print(line)

您错误地理解了值的表示形式,而不是值本身。

来自该文件的值不是文本(str);它们是字节序列(bytes),Python的程序员表示通过将字符串括在b'…'中来传达给您。这些封闭字符不是值的一部分;您将无法成功删除它们。

相反,您需要从字节创建一个文本字符串。您可以通过告诉字节序列自行解码来执行此操作:

for line_bytes in file:
    line = line_bytes.decode("utf-8")
    print(line)

这需要知道该字节序列的文本编解码器(上面的代码假设"utf-8")。您可以询问 HTTP 响应以询问编解码器,除非您知道如何在其他地方获取它。

另一种方法是打开文件,使其知道自己的文本编解码器;然后,从中检索的项目已经是文本。

最新更新