让 python3 下面的写的程序,能运行在 python2.7 上

2014-10-27 17:09:45 +08:00
 yakczh
filename='gbk.txt'
try:
s=open(filename,encoding='gbk').read()
print "OK"
except:
print "Error"


python3指定编码读文件的时候,如果编码不是指定的编码,会报错,上面这段代码在python3上运行是正确的,但是放到 python2.7下运行结果就不对 python2.7读gbk文件会提示Error, 2.7版本下有什么设置可以让这段代码在两个版本下运行结果一致吗?
7005 次点击
所在节点    Python
9 条回复
xunyu
2014-10-27 17:18:13 +08:00
2to3和3to2
Daniel65536
2014-10-27 17:28:59 +08:00
from io import open

在python2下:
open(name[, mode[, buffering]])
io.open(file[, mode[, buffering[, encoding[, errors[, newline[, closefd=True]]]]]])
em70
2014-10-27 17:30:07 +08:00
3和2不兼容,2有2的写法,不能直接放过来
lincanbin
2014-10-27 18:53:19 +08:00
要两个版本下运行结果一致,就写两套代码,然后拿sys.version_info出来判断一下决定用那套
ericls
2014-10-27 20:20:38 +08:00
from io import open
xucheng
2014-10-27 22:10:10 +08:00
import six
fghzpqm
2014-10-29 17:35:38 +08:00
Python 2:

$ ipython
Python 2.7.8 (default, Aug 20 2014, 12:09:53)

In [1]: import codecs

In [2]: print codecs.open('GBK', encoding='gbk').read()
你好

Python 3:

$ ipython
Python 3.4.2 (default, Oct 29 2014, 17:32:14)

In [1]: import codecs

In [2]: print(codecs.open('GBK', encoding='gbk').read())
你好
yakczh
2014-10-29 18:27:35 +08:00
@fghzpqm python3 输出正常

python27下 报错
---------- python27 ----------
Traceback (most recent call last):
File "codec-read-gbk.py", line 5, in <module>
print(codecs.open('gbk.txt', encoding='gbk').read())
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-7: ordinal not in range(128)

输出完成 (耗时 0 秒) - 正常终止
fghzpqm
2014-10-30 23:37:25 +08:00
@yakczh 看输出的异常信息:

UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-7: ordinal not in range(128)

是在 print 的时候将 unicode 用默认的 ASCII codec 编码(encode)的时候出错。和你直接:

print u"你好"

抛出的是同样的异常。

也就是说,为了确保你 print 的 unicode 不抛异常,你需要显示的把 unicode 编码成你终端使用的文本编码。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/141878

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX