Python 从文件中读取并保存到 utf-8
Posted
技术标签:
【中文标题】Python 从文件中读取并保存到 utf-8【英文标题】:Python reading from a file and saving to utf-8 【发布时间】:2013-11-04 16:00:44 【问题描述】:我在读取文件、处理字符串和保存到 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,我不知道为什么会发生这种情况。据我的研究表明,注释行应该可以解决问题。但是,当我使用这些行时,生成的文件主要在特殊字符中出现乱码,带有波浪号的单词作为文本是西班牙语。我真的很感激任何帮助,因为我很难过......
【问题讨论】:
这是哪个编辑器?哪个python版本?从这里开始,这段代码似乎是完全有效的,应该可以按预期工作…… 凯特是编辑。 python --version 的输出是 Python 2.7.5+ 我已经用 2.6.8、2.7.5+ 和 3.3.2+ 测试了您的代码,一切正常。你能提供一些示例输入吗? 由于文本是以原始字节处理的,因此看不见的处理代码可能会弄乱 UTF8 编码。 好的。我已经解决了。这主要是我的错,所以对不起大家。这就是发生的事情。如果我在打开文件时更改 iso-8859-15 而不是 utf-8,@MarkTolonen 提供的代码就可以工作。然而,当我的编辑器从内存中更新了已经加载旧编码的文件时,它向我展示了胡言乱语。当我再次打开文件时,它显示给我很好。谢谢大家,抱歉打扰了!!! 【参考方案1】:使用带有encoding
参数的open
在程序的I/O 边界处处理与Unicode 往来的文本。确保使用正在读取的文件的(希望记录在案的)编码。默认编码因操作系统而异(具体而言,locale.getpreferredencoding(False)
是使用的编码),因此我建议始终明确使用 encoding
参数以实现可移植性和清晰性(以下 Python 3 语法):
with open(filename, 'r', encoding='utf8') as f:
text = f.read()
# process Unicode text
with open(filename, 'w', encoding='utf8') as f:
f.write(text)
如果仍在使用 Python 2 或为了兼容 Python 2/3,io
模块实现 open
,其语义与 Python 3 的 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)
【讨论】:
我完全按照你说的做了。与其他建议相同的错误 我已经开始工作了。问题是原始文件是 iso-8859-15 @aarelovich 您可能需要将errors=ignore
或errors=replace
传递给open()
...如果您不知道文件的编码。 :)
@arturomp 这也行不通。 io.open
期望写入 Unicode 字符串,而不是字节字符串。它对声明的编码进行编码。
@arturomp 更正,它不适用于 Python 3。Python 2 将使用默认的 ascii
编解码器将字节字符串隐式转换回 Unicode,因此只要字符串是只有ASCII。这就是 Python 3 改变它的原因......它防止了“它有时会工作”,这是一个令人讨厌的错误。【参考方案2】:
你也可以通过下面的代码来打通:
file=open(completefilepath,'r',encoding='utf8',errors="ignore")
file.read()
【讨论】:
【参考方案3】:你不能使用 open 来做到这一点。使用编解码器。
当您在 python 中使用 open 内置函数打开文件时,您将始终以 ascii 格式读取/写入文件。要用 utf-8 写,试试这个:
import codecs
file = codecs.open('data.txt','w','utf-8')
【讨论】:
试过了,我得到一个错误:UnicodeDecodeError: 'utf8' codec can't decode byte 0xe9 in position 57: invalid continuation byte 您是否使用 utf-8 编码进行保存?看,如果你正在从另一个 ascii 文件中读取,你必须先对其进行解码。 代码如你所见。我所做的是将行 writer = open(output,'w') 替换为 writer = codecs.open(output,'w','utf-8') ,这让我遇到了这个错误【参考方案4】:编码参数的作用是什么。
my_list = ['1', '2', '3', '4']
with open('test.txt', 'w', encoding='utf8') as file:
for i in my_list:
file.write(i + '\n')
【讨论】:
以上是关于Python 从文件中读取并保存到 utf-8的主要内容,如果未能解决你的问题,请参考以下文章