V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
yakczh
V2EX  ›  Python

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

  •  
  •   yakczh · 2014-10-27 17:09:45 +08:00 · 7009 次点击
    这是一个创建于 3688 天前的主题,其中的信息可能已经有所发展或是发生改变。
    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版本下有什么设置可以让这段代码在两个版本下运行结果一致吗?
    9 条回复    2014-10-30 23:37:25 +08:00
    xunyu
        1
    xunyu  
       2014-10-27 17:18:13 +08:00
    2to3和3to2
    Daniel65536
        2
    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
        3
    em70  
       2014-10-27 17:30:07 +08:00
    3和2不兼容,2有2的写法,不能直接放过来
    lincanbin
        4
    lincanbin  
       2014-10-27 18:53:19 +08:00
    要两个版本下运行结果一致,就写两套代码,然后拿sys.version_info出来判断一下决定用那套
    ericls
        5
    ericls  
       2014-10-27 20:20:38 +08:00 via Android
    from io import open
    xucheng
        6
    xucheng  
       2014-10-27 22:10:10 +08:00
    import six
    fghzpqm
        7
    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
        8
    yakczh  
    OP
       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
        9
    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 编码成你终端使用的文本编码。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   978 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 22:50 · PVG 06:50 · LAX 14:50 · JFK 17:50
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.