【问题标题】:TypeError: write() argument 1 must be unicode, not strTypeError: write() 参数 1 必须是 unicode,而不是 str
【发布时间】:2019-03-15 18:13:54
【问题描述】:

我正在尝试导入一个文本文件并将其保存在我的桌面上,但文本是“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

【问题讨论】:

  • 如果您收到此错误消息,可能是 python 2 vs. 3 的问题。至少对我来说是这样。

标签: python python-2.7 urllib2 python-unicode


【解决方案1】:

您的问题是urlopen 返回一个面向字节的类文件对象,而io.open 需要真正的文本输入(其中“文本”表示“Python 2 上的unicode,Python 3 上的str”) .

你唯一需要改变的是decode调用read的结果;默认情况下它类似于字节,并且您需要真实的文本。您需要找出正确的编码(硬编码,或显式检查标头以找出答案)才能正确解码(可能是 UTF-8,或者不太可能是 cp1252,但它可能有点奇怪)。

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

libro.write(archivo.read())

到:

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

如果您非常确定服务器始终提供 UTF-8 输出,那么:

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

就足够了。是的,它有点浪费(你解码它只是为了将它写入一个立即重新编码它的流),但重要的是,这可以保证你收到的字节可以解释为有效的 UTF-8,它将原始字节转储到磁盘不保证。

更精细的解决方案检查标题:

import urllib2
import io
import string

def n_palabras(x):
    archivo = urllib2.urlopen(x)

    # Find charset in headers, if it exists    
    for p in archivo.headers.plist:
        key, sep, value = p.partition('=')
        if sep and key.strip().lower() == 'charset':
           encoding = value.strip()
           break
    else:
        encoding = 'utf-8'

    data = archivo.read()

    try:
        # Try to use parsed charset
        data = data.decode(encoding)
    except UnicodeDecodeError:
        # If that fails, try UTF-8 as fallback; let exception bubble
        # if this fails too
        data = data.decode('utf-8')

    with io.open("alice.txt", "w", encoding="utf-8") as libro:
        libro.write(data)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多