Python从文件读取并保存到utf-8


79

我在从文件读取,处理其字符串并将其保存到UTF-8文件时遇到问题。

这是代码:

try:
    filehandle = open(filename,"r")
except:
    print("Could not open file " + filename)
    quit() 

text = filehandle.read()
filehandle.close()

然后,我对可变文本进行一些处理。

然后

try:
    writer = open(output,"w")
except:
    print("Could not open file " + output)
    quit() 

#data = text.decode("iso 8859-15")    
#writer.write(data.encode("UTF-8"))
writer.write(text)
writer.close()

这样可以完美地输出文件,但是根据我的编辑器,它在iso 8859-15中可以输出。由于相同的编辑器将输入文件(在变量文件名中)识别为UTF-8,所以我不知道为什么会这样。据我的研究表明,注释行应该可以解决问题。但是,当我使用这些行时,产生的文件主要具有特殊字符的乱码,带有波浪号的单词作为文本是西班牙语。当我感到困惑时,我将不胜感激。


2
这是哪个编辑器?哪个python版本?从这里开始,此代码似乎是完全有效的,应该可以按预期方式工作…
filmor

凯特(Kate)是编辑。python --version的输出是Python 2.7.5+
aarelovich 2013年

我已经用2.6.8、2.7.5+和3.3.2+测试了您的代码,一切正常。您能否提供一些示例输入?
2013年

由于文本是用原始字节处理的,因此看不见的处理代码很可能弄乱了UTF8编码。
马克·托隆宁

3
好。我已经解决了 这主要是我的错,所以对不起大家。这是发生了什么事。如果我在打开文件时更改iso-8859-15而不是utf-8,则@MarkTolonen提供的代码将起作用。但是,当我的编辑器从已经加载了旧编码的内存中更新文件时,显示出乱码。当我再次打开文件时,它向我显示很好。谢谢大家,麻烦您了!!!
aarelovich 2013年

Answers:


196

使用以下codecs模块在程序的I / O边界处处理与Unicode之间的文本:

import codecs
with codecs.open(filename, 'r', encoding='utf8') as f:
    text = f.read()
# process Unicode text
with codecs.open(filename, 'w', encoding='utf8') as f:
    f.write(text)

编辑:io现在建议使用该模块而不是编解码器,并且该模块与Python 3的open语法兼容,如果使用Python 3,则可以在open不需要Python 2兼容性的情况下使用。

import io
with io.open(filename, 'r', encoding='utf8') as f:
    text = f.read()
# process Unicode text
with io.open(filename, 'w', encoding='utf8') as f:
    f.write(text)

6
我照你说的去做了 与其他建议相同的错误
aarelovich

1
我已经做好了。问题是原始文件是iso-8859-15
aarelovich

10
对于任何对此感兴趣的人,请注意,对于Python3open()io,open()相同。只需使用open()。签出help(open),您将看到它与io.open()相同-甚至标题说在模块io中打开内置函数的帮助。
肖恩·梅汉

1
@arturomp它也行不通。 io.open需要写入Unicode字符串,而不是字节字符串。它按照声明的编码进行编码。
马克·托洛宁

1
@arturomp Correction,它将在Python 3上不起作用。Python2将使用默认ascii编解码器将字节字符串隐式转换回Unicode ,因此只要字符串仅是ASCII,它将起作用。这就是Python 3对其进行更改的原因……它阻止了“它有时会工作”,这是一个令人讨厌的错误。
马克·托洛宁


4

您不能使用open来做到这一点。使用编解码器。

当您使用内置的open函数在python中打开文件时,您将始终以ascii读取/写入文件。要在utf-8中编写,请尝试以下操作:

import codecs
file = codecs.open('data.txt','w','utf-8')

2
尝试过此操作,但出现错误:UnicodeDecodeError:'utf8'编解码器无法解码位置57的字节0xe9:无效的继续字节
aarelovich 2013年

您是否要保存utf-8编码?看起来,如果您正在从另一个ascii文件中读取文件,则必须先对其进行解码。
Fernando Freitas Alves

代码如您所见。我所做的就是用writer = codecs.open(output,'w','utf-8')替换了writer = open(output,'w')的行,这让我得到了这个错误
aarelovich 2013年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.