文件操作:读写模式、操作模式、操作方法

文件操作

补充储备

1.with语法支持一次性打开多个文件,需要用逗号隔开
  eg:
  with open(r'a.txt','r',encoding='utf8') as f1 , open(r'b.txt','r',encoding='utf8') as f2,open(r'c.txt','r',encoding='utf8') as f3:
      pass
2.补全python语法(pass ...),但是不执行任何操作,在搭建项目框架时经常会用
3.通常情况下,英语单词的结尾如果跟上了able表示具备该单词描述的能力
  eg:
  readable  具备读取的能力
  writeable  具备填写内容的能力

  

文件读写模式

控制文件读写的操作模式有三个: 'r' 模式(默认)、'w'模式(只写模式)、'a'模式(追加只写模式)

1.r模式 : 只读模式(默认的模式) >>>使用该模式打开的文件,只能读,不能写
	1.1当文件路径不存在时,r模式打开文件会报错
       eg:
       with open(r'不存在的文件.txt','r',encoding='utf8') as f1:
           pass    # 报错
    1.2当文件路径存在时,r模式会打开该文件等待读取内容
      eg:
	  with open(r'存在的文件.txt','r',encoding='utf8') as f1:
      	  print(f1.read())   >>> 打印的是'存在的文件.txt'的内容
          f1.write('123')  # 报错 not writable 在r模式下只能读,不能写
2.w模式 :只写模式  >>>使用该模式打开的文件只能写,不能做其他操作(读)
	2.1当文件路径不存在时,w模式会自动创建该文件
      eg:
	  with open(r'不存在的文件_w.txt','w',encoding='utf8') as f1:
      	  pass
    2.2当文件路径存在时,w模式会先清空该文件内容 之后等待填写新的内容
      eg:
	  with open(r'存在的文件_w.txt','w',encoding='utf8') as f1:
      	  f1.write(123) # 报错 填写的内容只能是字符串
      	  f1.write('你好\n在干嘛') 
3.a模式 :追加只写模式 >>>使用该模式打开文件默认是在末尾追加新的内容 不能做其他操作(读)
	3.1当文件路径不存在时,a模式会自动创建该文件
    eg:
    with open(r'不存在的文件_a.txt','a',encoding='utf8') as f1:
    	pass
    3.2当文件路径存在时,a模式不会先清空该文件内容,只在文件内容末尾等待填写新的内容
    eg:
    with open(r'存在的文件_a.txt','a',encoding='utf8') as f1:
        # f1.write(123) # 报错 填写的内容只能是字符串
        f1.write('你好\n在干嘛')  >>>在文件内容末尾写"你好",另起一行"在干嘛"

文件的操作模式

文件的操作模式有 "t"模式(文本模式)、"b"模式(二进制模式)

1.t模式 :文本模式 >>>文本操作的默认模式
	r    rt
    w     wt
    a     at
  ps: 1.只能操作文本文件
        eg:with open(r'图片.jpg', 'rt', encoding='utf8') as f1:
               f1.read() # 报错
      2.必须指定encoding参数
        eg:
        with open(r'a.txt', 'rt') as f1:
        	print(f1.read())  >>> 读取内容乱码
      3.读写都是以字符串为单位
        eg:
        with open(r'a.txt','w',encoding='utf8') as f1:
        	f1.write(123)  # 报错 >>> 只能写字符串
2.b模式 : 二进制模式 >>》必须自己指定哪种模式
    r    rb
    w    wb
    a    ab
  ps:1.能够操作所有类型的文件
       eg:
       with open(r'图片.jpg','rb') as f1:
           print(f1.read())  >>> 返回二进制的数据类型
     2.不需要指定encoding参数
       eg:
       with open(r'a.txt','rb',encoding='utf8') as f1:
           pass  # 报错
     3.读写都以bytes为单位
       eg:
       with open(r'图片.jpg','rb') as f1:
           data = f1.read()
           print(type(data))  # <class 'bytes'>
3.拷贝功能
    3.1 文本模式(t) :读取(rt)-赋值-写入(wt)
      eg:
	  with open(r'a.txt','r',encoding='utf8') as f1,open('b.txt','w',encoding='utf8') as f2:
      	  data = f1.read()
      	  f2.write(data)
    3.2 二进制模式(b):读取(rb)-赋值-写入(wb)
    eg:
    with open(r'图片.jpg','rb') as f1,open(r'b.jpg','wb') as f2:
        data = f1.read()
        f2.write(data)

文件的操作方法

1.read() 一次读取文件内容,并且光标会停留在文件的末尾;如果继续读,就为空不打印
  eg:
  with open(r'a.txt','r',encoding='utf8') as f1:
      print(f1.read())
      print(f1.read())
  ps:原a.txt的文本内容是'11\n在干\nhello'执行以上代码 打印出的结果是'11\n在干\nhello',表明read()方法读取全部内容后,光标移到内容末尾,如果再继续打印,后面就是空的
2.当文件内容过大时,可使用for循环,一行一行的读取
  在CPU工作时,是与内存交接,当文件内容大小大于内存大小时,无法读取到内容;当使用for循环,当读取到一行内容以后会进行垃圾回收机制,来清理内存
  eg:
  with open(r'a.txt','r',encoding='utf8') as f1:
    for line in f1:
        print(line)
        print('****')
3.readline() 一次只读一行内容
  eg:
  with open(r'a.txt','r',encoding='utf8') as f1:
      print(f1.readline())  >>>打印第一行内容
      print(f1.readline())  >>>打印第二行内容
      print(f1.readline())  >>>打印第三行内容
4.readlines() 按照行的方式读取所有的内容并组织成列表返回 
  eg:
  with open(r'a.txt','r',encoding='utf8') as f1:
      print(f1.readlines())  # ['11\n', '在干嘛\n', 'hello']
5.readable() 判断当前文件是否可读  返回Farse、True
6.writeable() 判断当前文件是否可写 返回Farse、True
7.writelines() 支持填写容器类型(内部可以存放多个数据值的数据类型)多个数据值
  eg:
  with open(r'b.txt','w',encoding='utf8') as f1:
      f1.writelines(['nana\n','xiao\n','lisa\n'])
8.flush()  将内存中的文件数据立刻刷到硬盘(主动按ctrl+s)
  eg:
  with open(r'b.txt','w',encoding='utf8') as f1:
      f1.writelines(['nana\n','xiao\n','lisa\n'])
      f1.flush()

作业

1.编写简易版本的拷贝工具
自己输入想要拷贝的数据路径 自己输入拷贝到哪个地方的目标路径
任何类型数据皆可拷贝
ps:个别电脑C盘文件由于权限问题可能无法拷贝 换其他盘尝试即可

解题思路
1.拷贝文件,首先要读取文件内容,然后赋值,最后写入
2.题目是任何数据类型皆可以拷贝,就用b模式
orig_path = input("请输入你想要拷贝的数据路径>>>:").strip()
target_path = input("请输入你想要拷贝的目标路径").strip()
with open(orig_path,'rb') as f1:
    data = f1.read()
with open(target_path,'wb') as f2:
    f2.write(data)

2.利用文件充当数据库编写用户登录、注册功能
文件名称:userinfo.txt
基础要求:
用户注册功能>>>:文件内添加用户数据(用户名、密码等)
用户登录功能>>>:读取文件内用户数据做校验
ps:上述功能只需要实现一次就算过关(单用户) 文件内始终就一个用户信息
拔高要求:
用户可以连续注册
用户可以多账号切换登录(多用户) 文件内有多个用户信息
ps:思考多用户数据情况下如何组织文件内数据结构较为简单
提示:本质其实就是昨天作业的第二道题 只不过数据库由数据类型变成文件

1.单用户
while True:
    print("""
        1 注册
        2 登录
        """)
    choice =input("请输入你的指令:>>>").strip()
    if choice == '1':
        regis_name = input("请输入你想要注册的用户名:>>>").strip()
        regis_pwd = input("请输入你注册用户名的密码:>>>").strip()
        with open(r'userinfo.txt', 'w', encoding='utf8') as f1:
            f1.write(f'{regis_name}|{regis_pwd}')
            print("注册成功")
    elif choice == '2':
        in_name = input("请输入你用户名:>>>").strip()
        in_pwd = input("请输入你的密码:>>>").strip()
        with open(r'userinfo.txt','r',encoding='utf8') as f2:
            data = f2.read()
            real_name,real_pwd = data.split('|')
            if real_name == in_name and real_pwd == in_pwd:
                print("登录成功")
            else:
                print("登录失败")
    else:
        print("指令输入错误,再试一次")
    
2.多用户
tag_login = False
while True:
    print("""
        1 注册
        2 登录
        """)
    choice =input("请输入你的指令:>>>").strip()
    if choice == '1':
        regis_name = input("请输入你想要注册的用户名:>>>").strip()
        regis_pwd = input("请输入你注册用户名的密码:>>>").strip()
        with open(r'userinfo.txt', 'a', encoding='utf8') as f1:
            f1.write(f'{regis_name}|{regis_pwd}\n')
            print("注册成功")
    elif choice == '2':
        in_name = input("请输入你用户名:>>>").strip()
        in_pwd = input("请输入你的密码:>>>").strip()
        with open(r'userinfo.txt','r',encoding='utf8') as f2:
            data = f2.readlines()
            for user_info in data:
                real_name,real_pwd = user_info.strip().split('|')
                if real_name == in_name and real_pwd == in_pwd:
                    print("登录成功")
                    login_tag = True
                else:
                    continue
            if not tag_login:
                print("登录失败,请重新登录")  
    else:
        print("指令输入错误,再试一次")
posted @ 2022-06-29 23:38  DRAMA-娜娜  阅读(35)  评论(0编辑  收藏  举报