我正在尝试从强力球中奖号码文件中读取: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 响应以询问编解码器,除非您知道如何在其他地方获取它。
另一种方法是打开文件,使其知道自己的文本编解码器;然后,从中检索的项目已经是文本。