Python:如何强制输出iso-8859-1文件?

6 投票
4 回答
22837 浏览
提问于 2025-04-15 18:50

我想知道如何在Python中强制输出Latin-1编码的文件(我猜这指的是iso-8859-1?)

这是我目前的代码。它可以正常工作,但当我尝试将生成的输出文件导入到一个Latin-1的MySQL表中时,出现了奇怪的编码错误

outputFile = file( "textbase.tab", "w" )
for k, v in textData.iteritems():
    complete_line = k + '~~~~~' + v + '~~~~~' + " ENDOFTHELINE"
    outputFile.write(complete_line)
    outputFile.write( "\n" )
outputFile.close()

生成的输出文件似乎是以“Western (Mac OS Roman)”格式保存的,但即使我将其另存为Latin-1,仍然会遇到奇怪的编码问题。我该如何确保生成的字符串和文件本身都是以Latin-1编码的呢?

原始字符串(在textData字典中)是从一个RTF文件中解析出来的——我不知道这是否会有影响。

我对Python和编码的知识还比较浅薄,所以如果这个问题很傻,我先说声抱歉。我试着查看文档,但没找到太多有用的信息。

我使用的是Python 2.6.1。

4 个回答

0

这里的主要问题是你不知道你的数据是什么编码格式。如果我们假设你说的没错,你的文件是用Mac OS Roman编码的,那么你需要先把数据解码成unicode格式,然后再编码成iso-8859-1格式。

inputFile = open("input.rtf", "rb") # The b flag is just a marker in Python 2.
data = inputFile.read().decode('mac_roman')
textData = yourparsefunctionhere(data)

outputFile = open( "textbase.tab", "wb" ) # don't use file()
for k, v in textData.iteritems():
    complete_line = k + '~~~~~' + v + '~~~~~' + " ENDOFTHELINE"
    outputFile.write((complete_line + "\n").encode("iso-8859-1"))
    outputFile.close()

不过,考虑到这是RTF格式的文件,我不会感到惊讶,如果它是用Windows编码的,你也可以试试这种方式。我不太清楚RTF是怎么规定编码的。

1

对我来说,在 Python 2.7 中,io.open 在写入时速度稍快,而在读取时速度快了很多倍:

import io
with io.open("textbase.tab", "w", encoding="ISO-8859-1") as outputFile:
    ...

在 Python 3 中,你只需要在调用 open 时加上 encoding 这个参数就可以了,具体可以查看这里

12

简单来说,你可以使用 codecs 模块来写文件:

import codecs
outputFile = codecs.open("textbase.tab", "w", "ISO-8859-1")

当然,你写的字符串必须是 Unicode 字符串(类型是 unicode),如果是普通的 str 对象(其实就是字节数组),是不会被转换的。我想你在读取 RTF 文件的时候也在用普通的 Python 文件对象,所以你可能也需要把它转换成使用 codecs.open 的方式。

撰写回答