TypeError:write()参数1必须是unicode,而不是str

时间:2018-10-10 18:48:38

标签: python python-2.7 urllib2 python-unicode

我正在尝试导入文本文件并将其保存在桌面上,但是文本位于“ utf-8”中(书中有此信息),因此当我保存而不进行编码时,会有很多奇怪的字符,但是当我尝试使用显式编码进行保存时,会出现以下错误:

Traceback (most recent call last):

File "C:/Users/Unidas/Semestre/ABC/8.1.py", line 14, in n_palabras

libro.write(archivo.read())

TypeError: write() argument 1 must be unicode, not str

代码:

def n_palabras(x):
    import urllib2
    import io
    import string

    archivo = urllib2.urlopen(x)
    libro = io.open("alice.txt", "w", encoding="utf8")
    libro.write(archivo.read())
    libro.close()

如何使用utf-8编码保存此文件? 我在Python 2.7中使用Pycharm

1 个答案:

答案 0 :(得分:6)

您的问题是urlopen返回一个面向字节的类似文件的对象,而io.open则需要真实的文本输入(其中“ text”在Python 2上的意思是unicode,{{ 1}}(在Python 3上))。

您唯一需要更改的就是调用str的结果decode;默认情况下,它类似于字节,并且您需要真实的文本。您需要弄清楚正确的编码(对它进行硬编码,或显式检查标题以弄清楚)才能正确解码(可能是UTF-8或cp1252,但可能性很小),但这可能很奇怪)。

无论如何,知道这一点,您唯一需要做的更改就是更改:

read

收件人:

libro.write(archivo.read())

如果您确定服务器始终在提供UTF-8输出,则:

libro.write(archivo.read().decode(knownencoding))

就足够了。是的,这非常浪费(您仅将其解码以将其写入立即重新编码的流中即可),但是重要的是,这可以确保您将接收到的字节解释为有效的UTF-8,从而将原始字节转储到磁盘不能保证。

一种更精细的解决方案检查标头:

libro.write(archivo.read().decode('utf-8'))