python中的文件编码方式

        python的初学者一般会对python中的中文字符串的处理方式比较费解,本文将结合具体的实验解决大家的这一困惑。

一、源代码中的编码方式分析

        先举一个简单的例子,创建一个名为test.py的文件,内容如下

s = '中文'
print s
运行文件会报如下错误,

  File "D:/lsc/study/python code/test_python/test_unicode.py", line 1
SyntaxError: Non-ASCII character '\xe4' in file D:/lsc/study/python code/test_python/test_unicode.py on line 1, but no encoding declared; see http://python.org/dev/peps/pep-0263/ for details

在文件的第一行添加

# coding: gbk
执行文件后,输出乱码

����
对s进行解码后输出正常

# coding: gbk
s = '中文'.decode(encoding='gbk')
print s
为什么会这样呢?

        原来所有的文本文件在保存的时候,都会将文本进行编码,文本的编码方式一般默认为ANSI编码方式。如果代码中包含了非ASCII字符(比如中文),而源代码没有声明文件的编码方式,编译器就会默认一ANSI编码方式去对代码中的字符串进行解析,当发现字符串中包含大于127的字节时,就会报错。因此,当源代码中包含非ASCII字符时,需要在文件开头声明文件的编码方式,如utf-8或者gbk。

然而,文件编码方式的声明只能保证代码的正常执行,并不能保证非ASCII字符串的正常输出显示。上述代码在idle上输出为正常的中文,但是在pycharm上会输出乱码。这是因为不同的IDE对非ASCII字符串的支持程度不同。idle在打印非ASCII字符串时,会使用文件的编码方式将字符串解码成unicode字符串,然后显示到界面上;而pycharm的IDE设置中有一个IDE的编码方式设置,如果源代码的编码方式与IDE的编码方式不同,直接输出非ASCII字符串就会出现乱码。解决方法为将需要打印的非ASCII字符串以源代码的编码方式进行解码,使之转化为unicode字符串。所有实际内容相同的非ASCII字符串转换为unicode编码之后,编码均相同。笔者猜测IDE在打印字符串的时候(不论是不是unicode字符串),会先将字符串统一转化为unicode字符串,然后使用一套机制将unicode字符串打印出来。


二、读写文件时的编码方式分析

        经过上述分析,读者应该对编码方式有了一个初步的认识。下面对读写文件时的编码方式进行介绍。
前文已经说过,文本文件都是以字节串的方式存放在硬盘中的。文本编辑器在保存文件的时候,对于非ASCII编码的字符串(如中文),会先使用文件默认的编码方式将其编码为字节串。程序读取文件时,获取到的内容为编码后的字节串。想要恢复文本的内容,并且对文本内容进行正常的打印,必须先将字节串解码为unicode字符串。
建一个test.txt文本文件,用windows文本编辑器将文本的编码格式设置成ANSI。使用下面的代码读取并且打印test.txt文件的内容。
# coding: gbk
f = open('test.txt')
s = f.read()
print s.decode(encoding='gbk')

打印结果:
今天天气不错

如果不对s进行解码,pycharm编辑器将默认使用utf-8对s进行解码,打印结果将为乱码。

# coding: gbk
f = open('test.txt')
s = f.read()
print s#.decode(encoding='gbk')

打印结果:

������������




  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值