前两天用Python写了个小脚本,其中有个需求是从一个文本文件A中读取数据,然后处理一下写进一个新的文本文件B中。不过A文件中既有英文也有中文。 写出处理这个需求的代码并不复杂,随手就能写下类似的代码:
1
def write_a_line(line, fp):
2 fp.write(line)
不过这段程序一旦碰到有汉字的字符串时,可能就会遇到下面的问题:
Traceback (most recent call last):
File "", line 1, in
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128)
恩,这种情况对于我们平时使用C#或者Java的程序员来说确实比较头大。从这个错误提示来看,Python在写文件时,对line变量进行了编码操作,而且是针对line对象进行ASCII码的编码。
我们都知道Python是支持unicode的,而且还有针对unicode的类型“unicode”。要想让字符串称为unicode字符串,可以在字符串的引号前面加入一个小写字母“u”。翻阅Python的文档,我们可以发下write方法接收的是str对象。不过Python并不像C#,它不用声明变量的类型。所以我们应该先看看line到底是个什么对象。于是为了解决这个问题,我把上面的代码加了一行:
1def write_a_line(line, fp):
2 print line.__class__.__name__
3 fp.write(line)
代码运行之后,我发现当line中有中文的时候,我们的line变量的类型是unicode。从网上搜了一下与unicode与写文件相关的帖子,可以得到一个信息,对这unicode对象调encode方法进行编码就可以正常写文件了。于是代码又编程了下面的样子:
1def write_a_line(line, fp):
2 if line.__class__.__name__ == “unicode”:
3 line = line.encode(“GB2312”)
4 fp.write(line)
这里要注意的问题是不能一棍子打死,line可能会是unicode对象也可能是str对象,不过我们只对unicode对象进行编码。这下问题总算是解决了。
运维网声明
1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网 享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com