我正在尝试导入文本文件并将其保存在桌面上,但是文本位于“ 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
答案 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'))