使用Python将Ansi转换为UTF-8时出现错误
我在尝试写一个把Ansi转换成UTF-8的Python程序时,发现了这个链接:
https://stackoverflow.com/questions/14732996/how-can-i-convert-utf-8-to-ansi-in-python
这个链接是关于如何把UTF-8转换成Ansi的。
我想,既然可以把UTF-8转换成Ansi,那我只要反过来做就行了。所以我写了下面的代码:
file_path_ansi = "input.txt"
file_path_utf8 = "output.txt"
#open and encode the original content
file_source = open(file_path_ansi, mode='r', encoding='latin-1', errors='ignore')
file_content = file_source.read()
file_source.close
#write
file_target = open(file_path_utf8, mode='w', encoding='utf-8')
file_target.write(file_content)
file_target.close
但是这段代码出错了。
TypeError: file<> takes at most 3 arguments <4 given>
于是我把代码改成了:
file_source = open(file_path_ansi, mode='r', encoding='latin-1', errors='ignore')
变成了:
file_source = open(file_path_ansi, mode='r', encoding='latin-1')
结果又出现了另一个错误:
TypeError: 'encoding' is an invalid keyword arguemtn for this function
我该怎么修改我的代码才能解决这个问题呢?
1 个回答
9
你正在尝试在 Python 2 中使用 Python 3 的 open()
函数。在这两个主要版本之间,输入输出的支持进行了大改进,变得更好地支持编码和解码。
在 Python 2 中,你可以使用 io.open()
来获得相同的新版本。
我建议使用 shutil.copyfileobj()
函数 来进行文件复制,这样你就不需要把整个文件都读入内存了:
import io
import shutil
with io.open(file_path_ansi, encoding='latin-1', errors='ignore') as source:
with io.open(file_path_utf8, mode='w', encoding='utf-8') as target:
shutil.copyfileobj(source, target)
不过要小心;大多数人提到 ANSI 时,指的是 其中一个 Windows 代码页;你可能实际上有一个 CP(代码页)1252 的文件,这个编码 几乎 和 ISO-8859-1 (Latin 1) 一样,但又不完全相同。如果是这样,作为 encoding
参数时,请使用 cp1252
而不是 latin-1
。