V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
cqcn1991
V2EX  ›  问与答

求教一下 python 读取 json 以后,输出的问题(unicode 和中文显示)

  •  
  •   cqcn1991 · 2015-07-15 22:56:03 +08:00 · 4193 次点击
    这是一个创建于 3421 天前的主题,其中的信息可能已经有所发展或是发生改变。

    直接读json的话,里面的信息都会是unicode,于是找到了一个函数,可以帮忙解决转换的问题
    http://stackoverflow.com/questions/956867/how-to-get-string-objects-instead-of-unicode-ones-from-json-in-python)

    但是,中文的显示还是不行,输出见下

    def byteify(input):
        if isinstance(input, dict):
            return {byteify(key):byteify(value) for key,value in input.iteritems()}
        elif isinstance(input, list):
            return [byteify(element) for element in input]
        elif isinstance(input, unicode):
            return input.encode('utf-8')
        else:
            return input
    import json
    from pprint import pprint
    with open('C:\Users\Administrator\Desktop\movie_list_2014_v2.json') as data_file:    
        data = json.load(data_file)
    parsed_data = byteify(data)
    pprint(parsed_data[1]['douban_info'])
    

    输出(部分)

    'countries': ['\xe7\xbe\x8e\xe5\x9b\xbd'],
     'current_season': None,
     'directors': [{'alt': 'http://movie.douban.com/celebrity/1302444/',
                    'avatars': {'large': 'http://img3.douban.com/img/celebrity/large/45953.jpg',
                                'medium': 'http://img3.douban.com/img/celebrity/medium/45953.jpg',
                                'small': 'http://img3.douban.com/img/celebrity/small/45953.jpg'},
                    'id': '1302444',
                    'name': '\xe5\x86\x88\xe6\x89\x8e\xe7\xbd\x97\xc2\xb7\xe6\xb4\x9b\xe4\xbd\xa9\xe5\x85\xb9-\xe5\x8a\xa0\xe5\x8b\x92\xe6\x9e\x9c'}],
     'do_count': None,
     'douban_site': '',
     'episodes_count': None,
     'genres': ['\xe6\x81\x90\xe6\x80\x96'],
    

    想问一下,怎么让输出显示中文
    我用的,是Python2.7+notebook

    14 条回复    2015-07-23 08:56:08 +08:00
    imn1
        1
    imn1  
       2015-07-15 23:12:09 +08:00
    bytes?
    应该用 string 吧?
    lcqtdwj
        2
    lcqtdwj  
       2015-07-15 23:12:46 +08:00
    unicode多好
    cqcn1991
        3
    cqcn1991  
    OP
       2015-07-15 23:12:47 +08:00 via iPhone
    @imn1 你说哪个?
    cqcn1991
        4
    cqcn1991  
    OP
       2015-07-15 23:13:31 +08:00 via iPhone
    @lcqtdwj 难道正常情况下不应该是显示中文么…
    imn1
        5
    imn1  
       2015-07-15 23:19:31 +08:00
    encode('utf-8') 这个返回是 bytes 类型
    不熟 py2,你看别人的回复吧

    另外,简体windows dos 默认是 cp936,要显示 unicode 中文,需要程序指定utf-8,运行程序前要执行 chcp 65001 把 dos 转为 utf-8 兼容
    lcqtdwj
        6
    lcqtdwj  
       2015-07-15 23:29:14 +08:00
    我觉得这是跟你的pprint有关。打印的是object的str还是repr
    cqcn1991
        7
    cqcn1991  
    OP
       2015-07-15 23:29:36 +08:00 via iPhone
    @imn1 多谢。不过我这个是在Python notebook里面执行的,和dos有关系吗?
    Owenjia
        8
    Owenjia  
       2015-07-15 23:36:38 +08:00
    中文输出?好像要 ensure_ascii=False 才行吧。
    cqcn1991
        9
    cqcn1991  
    OP
       2015-07-15 23:37:56 +08:00 via iPhone
    @Owenjia 话说你们一般都不会涉及到中文的data wrangling么…
    Septembers
        10
    Septembers  
       2015-07-15 23:42:02 +08:00
    @cqcn1991 我一般不会在Windows上处理
    Tiande
        11
    Tiande  
       2015-07-15 23:43:33 +08:00
    ```
    import sys
    reload(sys)
    sys.setdefaultencoding("utf-8") #更改默认编码为utf-8
    ```

    加在最前面。

    http://www.2cto.com/kf/201407/317866.html
    Owenjia
        12
    Owenjia  
       2015-07-15 23:43:54 +08:00
    @cqcn1991

    print(json.dumps({"语言": "中文"}, ensure_ascii=False))

    这样不就输出中文了么?
    Sylv
        13
    Sylv  
       2015-07-16 03:04:31 +08:00   ❤️ 1
    你概念没弄清楚,并不是说 unicode 类型的字符串就无法显示中文了,json 数据用 unicode 是正确的,并不需要多此一举用 byteify 将其数据转换为 str 类型,stackoverflow 那个问题有这个需求是因为他用的其它库只接受 str 类型数据,而你真正的需求是将 json 数据 print 出来时能显示出中文。

    你没弄懂的是,Python 在 print 列表和字典等数据结构时,输出的是数据的内部存储格式,也就是说如果里面的元素是中文字符串,Python 不会把中文直接打印出来,而是会把中文的编码打印出来。
    例如:
    >>> print ['中', '文']
    ['\xe4\xb8\xad', '\xe6\x96\x87']
    相当于每个元素打印的是 repr 的结果:
    >>> print repr('中')
    '\xe4\xb8\xad'
    而如果直接打印其中的元素是能显示中文的:
    >>> print ['中', '文'][0]


    因此如果你想能显示出中文,不应该直接去 print 整个数据结构 object,应该将其转为相应格式的字符串后再 print。
    例如其中一种方法是:
    >>> s = repr(['中', '文']).decode('string-escape')
    >>> print s
    ['中', '文']
    如果元素是 unicode:
    >>> s = repr([u'中', u'文']).decode('unicode-escape')
    >>> print s

    而如果是 json 数据,更好的方法是用楼上说的方法:
    >>> print(json.dumps({u"语言": u"中文"}, ensure_ascii=False))
    {"语言": "中文"}
    cqcn1991
        14
    cqcn1991  
    OP
       2015-07-23 08:56:08 +08:00 via iPhone
    @Sylv 原来是这样!非常感谢!
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1129 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 22:58 · PVG 06:58 · LAX 14:58 · JFK 17:58
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.