资讯专栏INFORMATION COLUMN

Python基础-文件读写、JSON

Charles / 772人阅读

摘要:用户注册注册用户和密码存在文件里面读写文件要从文件里面取出来所有的用户名如果不存在就写入,存在就报用户名已注册存放所有的用户名用户名长度不合法密码长度不合法两次输入的密码不一致用户名已经注册注册成功用户登陆用户从中读取帐户和密码进行登陆登陆

username,12345678
username2,abc12345

用户注册

#1.注册:
    #用户和密码存在文件里面
    #username,123456
    #username2,abc123
#读写文件
    #1.要从文件里面取出来所有的用户名
    #2.如果不存在就写入,存在就报用户名已注册

f = open("users.txt","a+")
#f.seek(0)
res = f.read()
all_user_name = [] #存放所有的用户名
for r in res.split("
"): #["username,123456","username2,abc123"]
    #"username,123456"
    username = r.split(",")[0]
    all_user_name.append(username)
for i in range(3):
    username = input("username:").strip()
    pwd = input("pwd:").strip()
    cpwd = input("cpwd:").strip()
    if not(len(username) > 6 and len(username) < 20):
        print("用户名长度不合法")
    elif not (len(pwd) >=8 and len(pwd) <= 20):
        print("密码长度不合法")
    elif pwd != cpwd:
        print("两次输入的密码不一致")
    elif username in all_user_name:
        print("用户名已经注册")
    else:
        user_info = "%s,%s
"%(username,pwd)
        f.write(user_info)
        print("注册成功")
        break
f.close()

用户登陆

# 用户从user.txt 中读取帐户和密码进行登陆
# res = open("users.txt").read()
# username = input("username:")
# pwd = input("pwd:")
# user_info = username+","+pwd
# if user_info in res:
#     print("登陆成功")
# else:
#     print("登陆失败,帐号或密码错误")
#

all_user = {}
res = open("users.txt").read()
for r in res.split("
"): #["username,12345678","username2,abc12345"]
    #"username,12345678" ["username,12345678"]
    if r.strip() != "":
        username = r.split(",")[0]
        pwd = r.split(",")[1]
        all_user[username] = pwd
for i in range(3):
    username = input("username:")
    pwd = input("pwd:")
    if username in all_user:
        #if pwd == all_user.get(username):
        if pwd == all_user[username]:
            print("欢迎登录!")
        else:
            print("帐号/密码错误!")
    else:
        print("该用户未注册")
文件读写
r:只读,文件不存在,会报错
w: 只写,会清空原有内容,文件不存在会新建
a: 追加写,不会清空,文件不存在会新建
r+: 读写模式,文件不存在会报错
w+: 写读模式,文件不存在会创建,文件会被删除后重写
a+: 追加读模式,文件不存在会创建,文件只会被追加
rb、wb、ab: 以二进制方式,多用于图像,多媒体数据等

文件读

f = open("users.txt")
print(f.read()) #获取到文件里面所有的内容
print(f.read()) #再次读时会读不到内容
print(f.readlines()) #文件中所有内容,返回为list,文件中每行分别为一个元素
print(f.readline())  #一次读取一行内容

文件写

f1 = open("users.txt","a")
a=["username1,123456
","usrname2,123456
"]

for i in a:
    f1.write(i) #每次写入一行

f1.writelines(a) #writelines()方法用于将list写入文件

文件访问次数记录练习

# 1.要从日志中访问超过200次的
# 2.每分钟都运行一次
#思路:
    # 1.读取文件内容,获取IP地址
    # 2.把每个IP地址存起来
    #["192.168.1.1","192.168.1.2","192.168.1.3"]
    # 3.以字典方式存{"192.168.1.1":2,"192.168.1.3":5}
    #判断ip访问次数超过200次,如果字典的value超过200,加入黑名单

import time
point = 0 #初始的位置
while True:
    ips = {}
    f = open("access.log",encoding="utf-8")
    f.seek(point)
    for line in f: #循环读取文件里面每行数据
        ip = line.split(" ")[0] #按照空格分隔,取第一个元素ip
        if ip in ips: #判断这个IP是否存在
            ips[ip] += 1 #如存在,次数+1
        else:
            ips[ip] = 1 #不存在,IP次数为1
    point = f.tell() #记录文件指针位置
    f.close()
    for ip,count in ips.items(): #循环这个字典,判断次数大于200的
        if count >= 200:
            print("%s 加入黑名单"%(ip))
    time.sleep(60)

高效处理文件

f = open("access.log",encoding="utf-8") #f叫文件对象或文件句柄
#第一种用while循环
while True:
    line = f.readline() #一次只取一行
    if line != "":
        print(line)
    else:
        print("文件内容读完,结束")
        break

#第二种直接遍历文件
for line in f:
    print(line)

修改文件内容

#简单直接的方式
f = open(r"D:file.txt",encoding="utf-8")
res = f.read().replace("一点","二点")
f.close()
f = open(r"D:file.txt","w",encoding="utf-8")
f.write(res)
f.close()
#方式二
f1 = open("file.txt","w+",encoding="utf-8")
f1.seek(0)
res = f1.read().replace("一点","hello")
f1.seek(0)
f1.truncate() #清空文件里的内容
f1.write(res)
f1.close()
import os
f2 = open("file.txt",encoding="utf-8")
f3 = open("file.txt.bak","w",encoding="utf-8")
for line in f2:
    new_line = line.replace("NI","NIIIIIIII")
    f3.write(new_line)
f2.close()
f3.close()

os.remove("file.txt")
os.rename("file.txt.bak","file.txt")
import os
with open("file.txt",encoding="utf-8") as f1, open("file.txt.bak","w",encoding="utf-8") as f2: #使用with时,文件不用就会被自动关闭,可同时打开多个文件
    for line in f1:
        new_line = line.replace("二点","一点")
        f2.write(new_line)
os.remove("file.txt")
os.replace("file.txt.bak","file.txt")
JSON处理

JSON是一种通用的数据类型,所有的语言都认识
JSON是字符串
方法如下:

loads() 字符串转为字典

dumps() 字典转为字符串

load() 直接传入一个含有字符串的文件对象,将字符串转为字典

dump() 传入字典和文件对象,将字典转为字符串

如果涉及到文件,使用load()和dump()更方便

字符串转成字典
s = """
{
        "error_code": 0,
        "stu_info": [
                {
                        "id": 8410,
                        "name": "小黑1",
                        "sex": "男",
                        "age": 28,
                        "addr": "河南省济源市北海大道32号",
                        "grade": "天蝎座",
                        "phone": "13488709889",
                        "gold": 10401
                },
                {
                        "id": 11089,
                        "name": "小黑1",
                        "sex": "男",
                        "age": 28,
                        "addr": "河南省济源市北海大道32号",
                        "grade": "天蝎座",
                        "phone": "18612511124",
                        "gold": 100
                }
        ]
}
"""

import json
res = json.loads(s) #json串(字符串),转成字典
print(res)
print(res.keys)
print(type(res))
字典转为字符串
stus = {"xiaojun":"123456","xiaohei":"7891","xiaoliu":"111111","海龙":"111"}
res2 = json.dumps(stus, indent=4,ensure_ascii=False) #indent为缩进,中文默认使用的ascii编码,中文需要ensure_ascii=False
print(res2)
print(type(res2))
with open("stus.json","w",encoding="utf-8") as f:
    f.write(res2)
可以通过读取文件中内容,将字符串转为字典
f = open("stus.json",encoding="utf-8")
content = f.read()
user_dict = json.loads(content)
print(user_dict)
可能直接通用load(),传入文件对象将字符串转为字典
f = open("stus.json", encoding="utf-8")
user_dict = json.load(f) #load()可以直接传入一个文件对象
print(user_dict)
使用dump()传入字典和文件对象将字典转为字符串
stus = {"xiaojun":"123456","xiaohei":"7891","xiaoliu":"111111","海龙":"111"}
f = open("stus2.json","w",encoding="utf-8")
json.dump(stus, f, indent=4, ensure_ascii=False)

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/43655.html

相关文章

  • python大佬养成计划----读写json数据

    摘要:是一种轻量级的数据交换格式,易于人阅读和编写。使用函数需要导入模块将对象编码成字符串用于解码数据。该函数返回字段的数据类型。 json 使用 Python 语言来编码和解码 JSON 对象。JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,易于人阅读和编写。使用json函数需要导入json模块 json.dumps 将 Python 对象编码...

    CodeSheep 评论0 收藏0
  • Python3网络爬虫实战---31、数据存储:文件存储

    摘要:如果该文件已存在,文件指针将会放在文件的结尾。运行结果以上是读取文件的方法。为了输出中文,我们还需要指定一个参数为,另外规定文件输出的编码。 上一篇文章:Python3网络爬虫实战---30、解析库的使用:PyQuery下一篇文章:Python3网络爬虫实战---32、数据存储:关系型数据库存储:MySQL 我们用解析器解析出数据之后,接下来的一步就是对数据进行存储了,保存的形式可以...

    dreamans 评论0 收藏0
  • Python的高级特性,模块和IO操作

    摘要:所以如果像上述这样引入模块的时候,调用函数必须加上模块名通常情况下鼓励每个语句只导入一个包方便理解和阅读代码。 今天我们学习Python的高级特性、模块和IO操作,通过学习这些,我们可以更快的了解Python,使用Python。 高级特性中会讲述列表生成式、生成器、和一些高级函数,学习这些方便我们快速的生成列表,节省我们使用Python的时间,更快的使用Python达成我们的目的。 模...

    WelliJhon 评论0 收藏0
  • python基础教程:序列化

    摘要:默认情况下,它也是不安全的,如果数据是由黑客精心设计的,则反序列化的数据可能被植入恶意代码。总结为我们提供了数据序列化的工具。如果是自己内部使用,可以作为一个选择进行复杂对象的序列化。 上一节我们学习了文件的读写,把一个字符串(或字节对象)保存到磁盘是一件很容易的事情。但是在实际编程中,我们经常需要保存结构化数据,比如复杂的字典、嵌套的列表等等,这时候就需要我们想办法把这些结构化数据先...

    gityuan 评论0 收藏0

发表评论

0条评论

Charles

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<