从文件缓冲区实例读取Python错误

时间:2016-02-26 02:33:01

标签: python

我试图从强力球获奖号码文件中读取: 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(" \r\n'")
        print(line)

文件中的每一行都打印出来:

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

我收到错误:

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

我该如何解决这个问题?

4 个答案:

答案 0 :(得分:3)

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

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

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

答案 1 :(得分:0)

高度建议使用pandas用于这种IO,它将处理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

答案 2 :(得分:0)

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

str

答案 3 :(得分:0)

for line in file:
    line.lstrip("b'")
    line.rstrip(" \r\n'")
    print(line)

你错误地表达了价值,而不是价值本身。

来自该文件的值不是文本(str);它们是字节序列(bytes),Python的程序员表示通过将字符串括在b'…'中来与您通信。那些封闭的字符不是价值的一部分;你没有成功地删除它们。

相反,您需要从字节创建文本字符串。你通过告诉字节序列解码自己来做到这一点:

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

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

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