python学习Day13

Day 13

今日内容概要

  • 文件的读写模式(针对文本文件)
  • 文件的操作模式
  • 文件的多种内置方法

今日内容详细

1.文件的读写模式(针对文本文件)
补充知识:
with open(r 文件路径,读写模式,字符编码)as 变量名:
    print(变量名.read())
    #文件路径前需要加r可取消路径上\加字母的特殊含义
    
  1.with语法支持一次性打开多个文件(上下文管理)
with open(r'a.txt','r',encoding='utf8')as f1,open(r'b.txt','r',encoding='utf8')as f2:
    print(f1.read())
    print(f2.read())
  2.补全python语法 但是不执行任何操作
     pass或...   推荐使用pass,...容易看漏
    eg:
     if 1 == 1:
        pass#补全语法 不执行任何操作
  3.通常情况下英语单词的结尾如果有able表示具备该单词描述的能力
      readable  具备读取内容的能力
      writable  具备填写内容的能力
  4.循环数据类型的时候不要修改数据类型内部的数据值个数
文件三种读写模式:#仅能针对文本文件
1.r  只读模式
     #使用r模式打开的文件只能读取内容,不能写内容
   1)'如果文件路径存在,r模式会打开文件读取文件内容'
  with open(r'a.txt', 'r', encoding='utf8') as f:
     print(f.read()) #打印出a.txt文件路径中文件的内容
    
   2)'如果文件路径不存在,则会直接报错'
    
2.w  只写模式
     #使用w模式打开的文件只能写内容,不能读取内容
   1)'如果文件路径存在,w模式会先清空该文件内容,然后等待填写新内容'
  with open(r'a.txt', 'w', encoding='utf8') as f:
      f.write('123')#清空该文件内容后写入'123'

   2)'如果文件路径不存在,w模式会自动创建该文件'

3.a  追加模式
     #使用a模式打开的文件只能在末尾追加新内容,不能读取
   1)'如果文件路径存在,a模式不会清空内容,只会在文件末尾等待填写新内容'
 with open(r'b.txt', 'a', encoding='utf8') as f:
     f.write('123\n')#\n换行
    
   2)'如果文件路径不存在,a模式会自动创建该文件'
    
2.文件的操作模式
1.t  文本模式
   文件操作的默认模式:(当不写t时默认为文本模式)
     r = rt
     w = wt
     a = at
   1.只能操作'文本文件'
   2.必须指定encoding参数,不写会采取系统默认编码
   3.读写都是以'字符串'为单位

2.b  二进制模式#可以实现数据的拷贝
   必须自己指定,不能省略
     rb
     wb
     ab
   1.能够操作'所有类型'的文件
   2.不用指定encoding参数(因为二进制数不需要编码)
   3.读写都是以'bytes字节'为单位
   eg:
     with open(r'11.jpg', 'rb') as f:
          print(f.read())#打印出来的图片就是二进制
        
   '#利用二进制模式实现各种文件的拷贝:'
with open(r'111.jpg','rb')as read_f1,open(r'222.jpg','wb')as write_f2:#用读模式打开一个文件,用写模式打开另一个文件
    for i in read_f1: #利用for循环把read_f1中的内容一行一行循环打印出来 '利用for循环是为了不占用较大内存'
        write_f2.write(i)#把read_f1循环打印出来的内容写给write_f2
3.文件操作的多种方法
read()  一次性读取文件内容且光标会停留在文件末尾 继续执行读取则为空
 '当文件数据较大时,不推荐一次性读取,涉及多行建议用for循环'
 for i in f:
     print(i)#结果会把该文件内容一行一行显示出来(区别在于用完第一行自动会清除 不会占用内存)
readline()  一次只读一行内容
readlines()  按行的方式读取所有内容并组织成列表返回#注意换行符
readable()  判断当前文件是否可读#结果为布尔值
writable()  判断当前文件是否可写#结果为布尔值
write()  填写文件内容(注意填写时是先清空后填写)
writelines()  支持填写容器类型(内部可以存放多个数据值的数据类型 列表、字典、元组、集合)
     f.writelines(['张\n','李\n','王\n'])#运行后文件就会显示张李王各一行
flush()  将内存中的文件数据立刻刷到硬盘中(类似于保存)

作业

1.编写简易版本的拷贝工具
	自己输入想要拷贝的数据路径 自己输入拷贝到哪个地方的目标路径
	任何类型数据皆可拷贝
	ps:个别电脑C盘文件由于权限问题可能无法拷贝 换其他盘尝试即可
        
————————————————————————————————————————————————————————————————————
print(r'''自动拷贝文件小程序
    D:\pythonlx\a.txt 为文本文件
    D:\pythonlx\b.jpg 为图片文件
    D:\pythonlx\site\+文件名  为拷贝地址
    ''')
# 1.获取用户要拷贝的数据路径
file_name = input('请输入您要拷贝的文件地址>>:').strip()
# 2.获取想要拷贝到的地址
file_path = input('拷贝到哪里>>:').strip()
# 3.读取想要拷贝的数据路径对应内容,并写入目标路径中
# 3.1用读模式打开一个文件,用写模式打开另一个文件如不存在则会自动创建
# 3.2注意路径那里采用格式化输出 否则直接填路径会变成文本
with open(r'%s' % (file_name), 'rb')as read_f1, open(r'%s' % (file_path), 'wb')as write_f2:
    for i in read_f1:  # 利用for循环把read_f1中的内容循环打印出来赋值给i
        write_f2.write(i)  # 把i中循环打印的内容写入write_f2中
2.利用文件充当数据库编写用户登录、注册功能
	文件名称:userinfo.txt
	基础要求:
		用户注册功能>>>:文件内添加用户数据(用户名、密码等)
       用户登录功能>>>:读取文件内用户数据做校验
      ps:上述功能只需要实现一次就算过关(单用户) 文件内始终就一个用户信息
 	拔高要求:
       用户可以连续注册
   		用户可以多账号切换登录(多用户)  文件内有多个用户信息
      ps:思考多用户数据情况下如何组织文件内数据结构较为简单
   	提示:本质其实就是昨天作业的第二道题 只不过数据库由数据类型变成文件
        
———————————————————————————————————————————————————————————————————————— 
方式1:(不完整)
#1.获取用户注册信息
print('注册信息中..')
name=input('请设置您的用户名>>:').strip()
pwd=input('请设置您的纯数字密码>>:').strip()
#2.判断密码是否为纯数字
if pwd.isdigit():
    pwd = int(pwd)
    print('用户名密码注册成功')
else:
    print('请设置正确的密码')
#3.将用户注册信息放入一个变量名中,且必须是字符串格式
info =f'{name}|{pwd}'#需顶头写 不能缩进??
#4.创建一个文本文件,把用户信息添加到文本文件中
with open(r'D:\pythonlx\userinfo.txt','w',encoding='utf8')as write_f:
    write_f.write(info)
#9.为用户登录添加循环指令
while True:
#5.获取用户登录的信息
    login_name=input('请登录您的用户名>>:').strip()
    login_pwd=input('请输入您的登录密码>>:').strip()
#6.判断用户输入的密码是否为纯数字
    if not login_pwd.isdigit():
        print('请输入正确的密码')
    else:
#7.如果是纯数字就把用户输入的密码改为整数型
        login_pwd = int(login_pwd)
#8.从文本中提取用户信息判断用户名密码是否正确
    a=info.split('|')#把a变量名中存储的用户信息去掉'|'
    if login_name==a[0] and login_pwd==int(a[1]):
        print(f'用户{login_name}登录成功')
#10.创建退出登录
        instruct=input("输入'0'可退出登录>>:").strip()
        if int(instruct)==0:
            print('正在退出登录')
            continue
    else:
        print('登录失败,请重新登录')
______________________________________________________________________
方式2:(完整)
while True:
# 1. 先建立一个if..elif..else框架:通过指令确认用户想进行什么操作
    print("""
       1.注册用户
       2.登录用户
       3.退出程序
    """)
    instruct = input('请输入您的指令>>:').strip()
    if instruct == '1':
# 2. 获取用户注册信息
        username = input('请输入您注册的用户名>>:')
    # 2.1 判断用户注册的用户名在不在数据库中
        with open(r'userinfo.txt','r',encoding='utf8')as f:#读取文本文件中的数据
            for i in f:#利用for循环每次循环拿到该文本中的一行数据,方便一个一个去对比
                right_name= i.split('|')[0]#用一个变量名right_name存储i中的用户名(索引取值仅取索引0的值) 因为只需要判断用户名是否存在
                if right_name == username:#判断用户名是否存在
                    print('用户名已存在')
                    break #如果用户名存在则强制结束本次循环
            else:#当循环没有被强制结束也就是数据库中没有该用户名时执行下面操作
                password = input('请输入您注册的密码>>:')
            # 2.2 将获取到的用户信息录入到数据库中
            # 2.3 先创建一个格式存储在一个变量名中
                user_data = '%s|%s\r'%(username,password)#需加一个换行符,否则当注册多用户时会在一行显示
            # 2.4 将创建的格式变量名写入数据库中
                with open(r'userinfo.txt','a',encoding='utf8')as f:#读写模式要用追加模式,如果用w每次执行都会清除里面的内容
                    f.write(user_data)
                print(f'用户{username}注册成功')
    elif instruct == '2':
# 3. 获取用户登录信息
        username = input('输入登录用户名>>:')
        password = input('输入登录密码>>:')
        # 3.1  读取数据库中注册的用户信息与用户登录的信息对比
        with open(r'userinfo.txt','r',encoding='utf8')as f:
            for i in f:#用for循环每次循环拿到该文本中的一行数据,方便一个一个去对比
                right_name,right_pwd = i.split('|')#给数据库中取出的用户名和密码分别赋一个变量名 需注意此时数据库中的密码尾部有一个换行符
                if right_name == username and right_pwd.rstrip('\n') == password:#用数据库中的信息对比用户输入的信息并把密码尾部的换行符清除
                    print('登录成功')
                    break  # 如果登录成功则强制结束本次循环
            else:  # 当循环没有被强制结束也就是登录失败时执行下面操作
                print('用户名或密码错误')
    elif instruct == '3':
# 4. 当用户输入3指令时结束循环即可
        print("""
        退出程序中...
        
        已成功退出程序
        """)
        break
    else:
        print('指令错误')

posted @   逢诱  阅读(12)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示