之前一直使用python内置的读写文件函数open,参数中不含encoding一项。
它实际上是,读入文件是什么编码,写出文件就是什么编码。
如今遇到一个问题,需要把一个utf8编码txt的部分内容另存,为了postprocess还要存成gbk编码。
解决一:codecs模块的读写函数codecs.open
# -*- coding: gbk -*-
#!usr/bin/env python
import sys
import codecs
with codecs.open(sys.argv[1], 'r', encoding='utf-8') as f, codecs.open(sys.argv[2], 'w',encoding='gbk') as wf:
for line in f:
lines = line.strip().split('\t')
#newline = '{}\t{}\n'.format((lines[2]).encode('gbk'), (lines[3]).encode('gbk'))
newline = lines[2]+'\t'.decode('gbk')+lines[3]+'\n'.decode('gbk')
wf.write(newline)
读入时encoding指明文件编码(需已知),让程序用该方式decode读入txt,也就是说此时文件内容都是unicode对象字符了;
写出时encoding是目标保存编码方式,wf.write前要将组合字符串的编码统一。
只要注意将【读入字符】编码和【输入字符】编码统一,比如上面代码,lines[2]是unicode对象,'\t\n'是gbk编码,要么对前者encode,要么对后者decode。
解决二:直接对文件转码
其实不用在程序中纠结de-encode这么麻烦的问题,先直接存。
存好newtxt后,在shell使用iconv命令直接对文件转码:
[shenjiayu@cp01-shenjiayu: ~]$ iconv -f utf-8 -t gbk utf_file > gbk_file
不过如果在处理程序中出现了编码问题,那就还是要在de-encode上找办法了。