使用Python将Ansi转换为UTF-8时出现错误

5 投票
1 回答
18435 浏览
提问于 2025-04-18 14:18

我在尝试写一个把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

撰写回答