TypeError: write() argument 1 must be unicode, not str
TypeError: write() argument 1 must be unicode, not str
我正在尝试导入一个文本文件并将其保存在我的桌面上,但是文本在 "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的文件?
我正在使用 Pycharm 和 Python 2.7
你的问题是 urlopen
returns a bytes-oriented file-like object,而 io.open
需要真实的文本输入(其中 "text" 表示“unicode
在 Python 2,str
在 Python 3”)。
您唯一需要更改的是 decode
调用 read
的结果;默认情况下是 bytes-like,您需要真实的文本。您需要找出正确的编码(hard-coding 它,或显式检查 headers 来找出正确的编码)才能正确解码(它可能是 UTF-8,也可能是 cp1252,但它可能有些奇怪)。
无论如何,知道这一点后,您唯一需要做的改变就是:
libro.write(archivo.read())
至:
libro.write(archivo.read().decode(knownencoding))
如果您非常确定服务器始终提供 UTF-8 输出,那么:
libro.write(archivo.read().decode('utf-8'))
足够了。是的,这有点浪费(你解码它只是为了将它写入一个立即重新编码它的流),但重要的是,这可以保证你收到的字节可以解释为有效的 UTF-8,它将原始字节转储到磁盘不保证。
更详细的解决方案检查 headers:
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)
我正在尝试导入一个文本文件并将其保存在我的桌面上,但是文本在 "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的文件? 我正在使用 Pycharm 和 Python 2.7
你的问题是 urlopen
returns a bytes-oriented file-like object,而 io.open
需要真实的文本输入(其中 "text" 表示“unicode
在 Python 2,str
在 Python 3”)。
您唯一需要更改的是 decode
调用 read
的结果;默认情况下是 bytes-like,您需要真实的文本。您需要找出正确的编码(hard-coding 它,或显式检查 headers 来找出正确的编码)才能正确解码(它可能是 UTF-8,也可能是 cp1252,但它可能有些奇怪)。
无论如何,知道这一点后,您唯一需要做的改变就是:
libro.write(archivo.read())
至:
libro.write(archivo.read().decode(knownencoding))
如果您非常确定服务器始终提供 UTF-8 输出,那么:
libro.write(archivo.read().decode('utf-8'))
足够了。是的,这有点浪费(你解码它只是为了将它写入一个立即重新编码它的流),但重要的是,这可以保证你收到的字节可以解释为有效的 UTF-8,它将原始字节转储到磁盘不保证。
更详细的解决方案检查 headers:
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)