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

Python从文件读取并保存到utf-8,python,python-2.7,utf-8,Python,Python 2.7,Utf 8,我在读取文件、处理其字符串和保存到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:

我在读取文件、处理其字符串和保存到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()

这完美地输出了文件,但根据我的编辑器,它是在ISO8859-15中输出的。由于同一个编辑器将输入文件(在变量filename中)识别为UTF-8,我不知道为什么会发生这种情况。据我的研究表明,注释行应该可以解决这个问题。然而,当我使用这些行时,生成的文件中主要有特殊字符的乱码,文本中带有波浪形的单词是西班牙语。我真的很感激任何帮助,因为我被难住了……

你不能用open来做这件事。使用编解码器

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

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

使用带有
编码
参数的
打开
,在程序的I/O边界处处理与Unicode之间的文本。确保使用正在读取的文件的编码(希望有文档记录)。默认编码因操作系统而异(具体来说,
locale.getpreferredencoding(False)
是使用的编码),因此我建议始终显式使用
encoding
参数以实现可移植性和清晰性(下面的Python 3语法):

如果仍然使用Python2或Python2/3兼容性,
io
模块使用与Python3的
open
相同的语义实现
open
,并存在于两个版本中:

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)

您也可以通过以下代码来完成:

file=open(completefilepath,'r',encoding='utf8',errors="ignore")
file.read()

这是哪位编辑?哪个python版本?从这里看,这段代码似乎是完全有效的,应该按照预期工作……凯特是编辑。python的输出——版本是Python2.7.5+,我已经用2.6.8、2.7.5+和3.3.2+测试了您的代码,一切正常。您能提供一些示例输入吗?因为文本是以原始字节处理的,所以看不见的处理代码可能会弄乱UTF8编码。Ok。我已经解决了。这主要是我的错,所以对不起大家。下面是发生的事情。如果我在打开文件时更改iso-8859-15而不是utf-8,则@MarkTolonen提供的代码有效。然而,当我的编辑器从已经加载了旧编码的内存中更新该文件时,它向我显示出了胡言乱语。当我再次打开文件时,它很好地向我展示了它。谢谢大家,很抱歉打扰大家!!!尝试此操作后,我遇到了一个错误:UnicodeDecodeError:“utf8”编解码器无法解码位置57中的字节0xe9:无效的延续字节。是否使用utf-8编码保存?看,如果你从另一个ascii文件中读取数据,你必须先对它进行解码。代码与你看到的一样。我所做的是用writer=codecs.open(output,'w','utf-8')替换writer=open(output,'w','utf-8')这一行,结果我犯了这个错误,我完全按照你说的做了。和另一个建议一样的错误我已经成功了。问题是原始文件是iso-8859-15@aarelovich您可能需要将
errors=ignore
errors=replace
传递到
open()。。。如果您不知道文件的编码:)@arturomp也不管用
io.open
要求写入Unicode字符串,而不是字节字符串。它对声明的编码进行编码。@arturomp更正,它在Python 3上不起作用。python2将使用默认的
ascii
编解码器将字节字符串隐式转换回Unicode,因此只要字符串仅为ascii,它就可以工作。这就是为什么Python3改变了它…它阻止了“它有时会工作”,这是一个令人讨厌的bug。
file=open(completefilepath,'r',encoding='utf8',errors="ignore")
file.read()