zoukankan      html  css  js  c++  java
  • 使用python操作json文本文件

    使用python读写文本文件内容时,我们知道如果文本文件里的内容无规律,那么修改起来比较麻烦。但是如果文本文件存储是有规律的,比如JSON格式,在利用python内置的函数把JSON格式的数据转成python字典对象之类,操作起来则非常便捷。

    阅读本文需要对python文件操作有简单了解

    查看python读取文件的类型

    在文本文件里随意存放一些数据,然后使用python读取出来,读到的是字符串。代码演示如下:

    f = open('hello.txt', mode='r', encoding='utf-8')
    data = f.read()
    print(type(data))
    print(data)
    # 输出如下:
    # <class 'str'>
    # hello-world
    # 你好世界
    

    演示代码文本的编码均为UTF-8

    字符串与字典互转

    为什么要互转呢,我们这里主要是针对文本文件的操作。我们读文本文件时读到是字符串,相应的把数据写入文本文件的时候,也是把字符串写入文本文件。但是在程序中,字符串不好操作,而类似字典这种类型的数据结构容易操作,所以需要字符串与字典互转。

    需要用到json模块的俩个函数,json.dumps()json.loads()

    把字典数据转成字符串并写入到文本文件中去。代码演示如下:

    import json
    
    data = {
        'axing': 'qx123456',
        'bxing': 'wx123456',
        'cxing': 'ex123456',
        'dxing': 'rx123456'
    }
    
    f = open('xjson.txt', 'w')
    data = json.dumps(data) # 字典转字符串
    f.write(data) # 写入
    f.close()
    

    运行上面的程序,xjson.txt里的内容就会变成

    {"axing": "qx123456", "bxing": "wx123456", "cxing": "ex123456", "dxing": "rx123456"}
    

    上面代码中的扩展名txt不是必须的,换成其它文本文件扩展名也可以。刚开始不用先创建xjson.txt文件,检查到没有该文件python会自动创建的。

    现在假设我们已经有一个xjson.txt文本文件,内容只有一行{"axing": "qx123456", "bxing": "wx123456", "cxing": "ex123456", "dxing": "rx123456"},现在我们需要把这段文本的最后一项修改成dxing: x2018,代码演示如下:

    import json
    
    # 修改文件里的内容
    f = open('xjson.txt', 'r+')
    data2 = json.loads(f.read()) # 字符串转字典
    data2['dxing'] = 'x2018'
    f.seek(0) # 把文件指针移动到头部
    # print(f.tell())
    f.write(json.dumps(data2))
    f.close()
    

    可以看到非常简单的就修改了文本文件里的内容。

    小练习-模拟登录

    现在我们可以利用python操作文本文件,来时实现一个登录小程序。要求账号密码存储在文件中,并且密码输入错误三次以后锁定该用户,下次使用该用户名登录时,仍然处于锁定状态。

    测试数据可以使用以下代码生成。

    import json
    
    data = {
        'zsheng': {
            'pwd': 'z123',
            'lock': 0
        },
        'xsheng': {
            'pwd': 'x123',
            'lock': 0
        },
        'csheng': {
            'pwd': 'c123',
            'lock': 0
        },
        'vsheng': {
            'pwd': 'v123',
            'lock': 0
        }
    }
    
    f = open('account.json', mode='w', encoding='utf-8')
    data2 = json.dumps(data)
    f.write(data2)
    f.close()
    
    

    生成的测试数据如下。
    {"zsheng": {"pwd": "z123", "lock": 0}, "xsheng": {"pwd": "x123", "lock": 0}, "csheng": {"pwd": "c123", "lock": 0}, "vsheng": {"pwd": "v123", "lock": 1}}

    参考实现如下

    import json
    
    f = open('account.json', mode='r+', encoding='utf-8')
    data = json.loads(f.read())
    count = 0
    
    while 1:
        username = input('Please input you username: ')
        if username == 'q':
            exit()
        if username not in data:
            print('Wrong username!')
            continue
        if username in data:
            if data[username]['lock'] == 1:
                print('Your account is locked! Refuse to login!')
                exit()
            while 1:
                count += 1
                if count > 3:
                    data[username]['lock'] = 1
                    # print(data)
                    f.seek(0)
                    f.write(json.dumps(data))
                    print('Your account is locked!')
                    exit()
    
                print('This is your %d time try!' % count)              
                password = input('Please input your password: ')
                if data[username]['pwd'] == password:
                    print('Welcome to login %s' % username)
                    exit()
                elif password == 'q':
                    exit()
                else:
                    print('Wrong password, retry!')
                    continue
    f.close()
    
    
  • 相关阅读:
    iptables详解(7):iptables扩展之udp扩展与icmp扩展
    iptables详解(6):iptables扩展匹配条件之’–tcp-flags’
    iptables(五)iptables匹配条件总结之二(常用扩展模块)
    Neutron之OVS
    Neutron三层网络服务实现原理
    Neutron二层网络服务实现原理
    LoadBalancerv2的原理分析
    Haproxy介绍
    基于zepto的手机焦点图touchstart touchmove
    zepto.js 处理Touch事件(实例)
  • 原文地址:https://www.cnblogs.com/asheng2016/p/8869863.html
Copyright © 2011-2022 走看看