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
tihiro
V2EX  ›  Python

请教一个写入字典到文件到问题

  •  
  •   tihiro · 2017-10-11 17:33:24 +08:00 · 2335 次点击
    这是一个创建于 2387 天前的主题,其中的信息可能已经有所发展或是发生改变。
    想把一个字典类型的变量写入到文件中,并且保证字典的格式为看起来比较舒服的格式。
    使用 python 版本 2.7.10
    # encoding: utf-8
    import json

    def main():
    a = {
    'addr': '北京',
    'type': 1,
    'deleted': False,
    'name': None,
    }
    dict = json.dumps(a, encoding='utf-8', ensure_ascii=False, indent=4)
    with open('a.txt', 'a') as f:
    f.write(dict)


    if __name__ == '__main__':
    main()

    上面方法得到的结果
    {
    "deleted": false,
    "type": 1,
    "addr": "北京",
    "name": null
    }

    怎样得到
    {
    "deleted": False,
    "type": 1,
    "addr": "北京",
    "name": None
    }
    请问怎么得到这种格式的文件?

    还试过另外一种方法如下:

    def main():
    a = {
    'addr': '北京',
    'type': 1,
    'deleted': False,
    'name': None,
    }
    with open('a.txt', 'a') as f:
    f.write('a = ' + str(a))

    结果如下:
    a = {'deleted': False, 'type': 1, 'addr': '\xe5\x8c\x97\xe4\xba\xac', 'name': None}

    它没有格式化输出结果,而且 unicode 字符串是\u 形式转义了的,可读性很差,请问有什么办法可以改进?
    8 条回复    2017-10-11 20:48:27 +08:00
    gstqc
        1
    gstqc  
       2017-10-11 18:01:16 +08:00
    这是什么鬼……

    1. None, False 是 dict
    null, false 是 json

    2. dict = json.dumps
    为啥要用内置函数名做变量名,而且 json.dumps 后类型是 str,变量名是 dict

    最后
    要把字典写入数据
    直接 f.write(str(a)) 就可以了
    konia
        2
    konia  
       2017-10-11 18:01:24 +08:00
    ```
    {
    "deleted": False,
    "type": 1,
    "addr": "北京",
    "name": None
    }
    ```

    这种就不是合法的 json 格式吧。为啥要这么存。。。
    tihiro
        3
    tihiro  
    OP
       2017-10-11 18:06:51 +08:00
    @gstqc 第一点,我知道的,目的是为了写入到文件中,后面直接把文件拿过来当字典使用
    第二点,确实不应该这么用,抱歉,考虑不周。
    最后直接 f.write(str(a)) 格式太丑了,而且 unicode 字符串是\u 形式转义了的。
    azh7138m
        4
    azh7138m  
       2017-10-11 18:09:04 +08:00
    可以用 pickle
    这种问题叫做序列化:)
    azh7138m
        5
    azh7138m  
       2017-10-11 18:10:21 +08:00
    没看到还要舒服的格式:(
    那用 xml 自己慢慢存?
    lolizeppelin
        6
    lolizeppelin  
       2017-10-11 19:24:06 +08:00
    存 json, 有参数让 json 格式变漂亮,有参数输出中文,自己找
    linw1995
        7
    linw1995  
       2017-10-11 20:46:24 +08:00
    不是一般用 json 比较多吗?写入用 json.dump,读取用 json.load 就好了。若是数据量大用 pickle 序列化后存到文件里,或者把 json 格式写成 gzip 压缩的。
    azurexie
        8
    azurexie  
       2017-10-11 20:48:27 +08:00
    中文转码建议用 codecs
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3304 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 12:14 · PVG 20:14 · LAX 05:14 · JFK 08:14
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.