我的系统是:python3.3 + win7。
文件c:\\test_before
以gbk编码。您可以下载它
从此处将其保存为c:\\test_before
以进行测试
http://pan.baidu.com/s/1i3DSuKd
当我设置chcp 936
时,我可以获得每一行输出。
cname="c:\\test_before"
dat=open(cname,"r")
for line in dat.readlines():
print(line)
现在,我用python将文件更改为utf-8。
cname="c:\\test_before"
dat=open(cname,"rb")
new=open("c:\\test_utf-8","wb")
for line in dat.readlines():
line=line.decode("gbk").encode("utf-8")
new.write(line)
new.close()
当我设置chcp 65001
并运行它时
new=open("c:\\test_utf-8","r")
for line in new.readlines():
print(line)
为什么输出错误?
UnicodeDecodeError:' gbk'编解码器不能解码370位的字节0xa5:非法
多字节序列。
答案 0 :(得分:0)
很可能Python没有检测到使用chcp
命令进行的临时代码页更改,因此在调用open
时它不会使用正确的编码。你很可能通过这样做验证自己:
>>> fd = open('/tmp/somefile.txt', 'r')
>>> fd
<_io.TextIOWrapper name='/tmp/somefile.txt' mode='r' encoding='UTF-8'>
您当然可以在Python 3中覆盖它,您可以执行以下操作:
>>> fd = open('/tmp/somefile.txt', 'r', encoding='UTF-8')
>>> fd
<_io.TextIOWrapper name='/tmp/somefile.txt' mode='r' encoding='UTF-8'>
使encoding
参数更加明确可能就是您想要的。
此外,您还可以在不使用二进制模式的情况下打开写入端(我看到您指定了'wb'
。如果要翻译编码,只需使用'w'
并明确说明您的目标编码。 / p>
>>> fd2 = open('/tmp/write.txt', 'w', encoding='UTF-8')
>>> fd2.write(u'abcd話')
5
但它会返回写入的字符数。
要完成翻译,你绝对可以做点什么
cname = "c:\\test_before"
dat = open(cname, "r", encoding="gbk")
new = open("c:\\test_utf-8", "w", encoding="utf-8")
for line in dat.readlines():
new.write(line)
new.close()
最后,您应该使用文件处理程序上下文管理器来保持一致性并避免在这个简单的用例中需要关闭文件,您的代码看起来像这样:
def gbk_to_utf8(source, target):
with open(source, "r", encoding="gbk") as src:
with open(target, "w", encoding="utf-8") as dst:
for line in src.readlines():
dst.write(line)