3

我刚开始使用 Python,我正在尝试制作一个程序,它可以在从互联网“www....../lyrics.txt”打开的屏幕上写入一首歌曲的歌词。我的第一个代码:

    import urllib.request
    lyrics=urllib.request.urlopen("http://hereIsMyUrl/lyrics.txt")
    text=lyrics.read()
    print(text)

当我激活此代码时,它没有给我网站上写的歌词,它在所有应该是新行的地方给了我换行命令 '\r\n' 并给了我所有歌词在一个长长的凌乱的字符串中。例如:这里的一些歌词\r\n这应该已经是下一行\r\n等等。

我在互联网上搜索代码以用新行替换 '\r\n' 命令并尝试以下操作:

    import urllib.request
    lyrics=urllib.request.urlopen("http://hereIsMyUrl/lyrics.txt")
    text=lyrics.read()
    text=text.replace("\r\n","\n")
    print(text)

我希望它至少会替换一些东西,但它给了我一个运行时错误:

    TypeError: expected bytes, bytearray or buffer compatible object

我在互联网上搜索了该错误,但没有找到与从互联网打开文件相关的任何内容。

我已经被困在这一点上几个小时了,不知道如何继续。请帮忙!提前致谢!

4

3 回答 3

8

您的示例不起作用,因为read语句返回的数据是“字节对象”。您需要使用适当的编码对其进行解码。request.urlopen另请参阅file.read字节数组操作的文档。

下面给出了一个完整的工作示例:

#!/usr/bin/env python3

import urllib.request

# Example URL
url = "http://ntl.matrix.com.br/pfilho/oldies_list/top/lyrics/black_or_white.txt"

# Open URL: returns file-like object
lyrics = urllib.request.urlopen(url)

# Read raw data, this will return a "bytes object"
text = lyrics.read()

# Print raw data
print(text)

# Print decoded data:
print(text.decode('utf-8'))

# If you still need newline conversion, you could use the following
text = text.decode('utf-8')
text = text.replace('\r\n', '\n')
print(text)
于 2013-04-02T19:51:39.433 回答
4

在 Python 3 中,字节的处理方式与文本字符串不同。线后

text=lyrics.read()

如果你试试这个

print(type(text))

它返回

<class 'bytes'>

所以它不是一个字符串,它是一个字节列表。

当您调用时text=text.replace("\r\n","\n"),您正在传递字符串,这就是错误消息的原因。所以你有两个选择。

  1. 通过在行后添加此行,将变量“文本”从字节转换为文本 text=lyrics.read()

    text = text.decode("utf-8")
    
  2. 更改replace调用以使用字节而不是字符串

        text=text.replace(b"\r\n",b"\n")
    

我推荐选项 1,以防您对文本进行更多的字符串操作。

于 2013-04-02T19:53:56.233 回答
0

以下适用于我在 Python 3.2 中:

import urllib.request
lyrics=urllib.request.urlopen("http://google.com/")
text=str(lyrics.read())
text=text.replace("\r\n","\n")
print(text)

关键区别在于, Lyrics.read() 返回一个字节对象,而不是一个字符串,replace() 不知道如何处理。在执行替换工作之前将其包装在 str() 中。

于 2013-04-02T19:56:55.910 回答