Python:如何强制输出iso-8859-1文件?
我想知道如何在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 个回答
这里的主要问题是你不知道你的数据是什么编码格式。如果我们假设你说的没错,你的文件是用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是怎么规定编码的。
对我来说,在 Python 2.7 中,io.open
在写入时速度稍快,而在读取时速度快了很多倍:
import io
with io.open("textbase.tab", "w", encoding="ISO-8859-1") as outputFile:
...
在 Python 3 中,你只需要在调用 open
时加上 encoding
这个参数就可以了,具体可以查看这里。
简单来说,你可以使用 codecs
模块来写文件:
import codecs
outputFile = codecs.open("textbase.tab", "w", "ISO-8859-1")
当然,你写的字符串必须是 Unicode 字符串(类型是 unicode
),如果是普通的 str
对象(其实就是字节数组),是不会被转换的。我想你在读取 RTF 文件的时候也在用普通的 Python 文件对象,所以你可能也需要把它转换成使用 codecs.open
的方式。