day11:02文件操作模式详解

(以t模式为基础进行内存操作)

1. r(默认的操作模式)

介绍: 只读模式,当文件不存在时报错,当文件存在时文件指针跳到开始位置

举例1:读取两次文件

打开文件一次,读取文件(这里说的都是t模式,只针对txt文本文件)两次

① 第一次读取文件,指针到文件内容的末尾,在不重新打开文件时继续读文件,程序会从当前指针位置往后读取内容,故读取的结果为空。

with open('c.txt',mode='rt',encoding='utf-8') as f:
    print('第一次读'.center(50,'*'))
    res=f.read() # 把所有内容从硬盘读入内存
    print(res)
    
    print('第二次读'.center(50,'*'))  # >>
    res1=f.read()
    print(res1)

在这里插入图片描述
②如果需要进行第二次读,必须重新打开文件

with open('c.txt',mode='rt',encoding='utf-8') as f:
    print('第一次读'.center(50,'*'))
    res=f.read() # 把所有内容从硬盘读入内存
    print(res)

with open('c.txt', mode='rt', encoding='utf-8') as f:    # 打开文件重读
    print('第二次读'.center(50,'*'))
    res1=f.read()
    print(res1)

案例1:通过文件获取用户信息

注意:匹配用户的信息时,一般将数据信息放入文件(或数据库)

案例:编写一个简易的用户登录验证系统,该系统从用户处接收用户名和密码输入,并通过读取一个名为user.txt的文本文件来验证输入的用户名和密码是否匹配。文本文件中的每一行都包含一个用户名和密码,它们之间用冒号(:)分隔。如果输入的用户名和密码与文件中的某行匹配,则输出“login successfull”,并结束程序;如果不匹配,则遍历完整个文件后输出“账号或密码错误”。
inp_username = input(“请输入您的用户名>>”).strip()
inp_pasword = input(“请输入您的密码>>”).strip()

with open('user.txt',mode='rt', encoding='utf-8') as f:
    for line in f:
        # print(f'line的结果为:{line}')
        # print(f'line去掉末尾的换行后:{line.strip()}')
        username , password = line.strip().split(':')
        # print( line.strip().split(':'))
        if username == inp_username and password == inp_pasword:
            print(f'login successful')
            break
        else:                       
            print(f'login failed')
            break

注意:上述代码中的else位置存在问题,else 语句放在了 if 语句内部,并且无论是否匹配都执行了 break。这意味着只要循环中的第一次迭代不匹配,就会打印 login failed 并退出循环,这显然是错误的。您应该将 else 语句与 for 循环相关联,使用 for…else 结构,这样 else 只有在循环正常结束(即没有通过 break 退出)时才会执行。

修正后的代码如下:

inp_username = input("请输入您的用户名>>").strip()
inp_password = input("请输入您的密码>>").strip()

with open('user.txt',mode='rt', encoding='utf-8') as f:
    for line in f:
        username , password = line.strip().split(':')  
        if username == inp_username and password == inp_password:
            print(f'login successful')
            break
    else:
        print(f'login failed')

**结论:
应用程序====》文件
应用程序====》数据库管理软件=====》文件

2. w:只写模式

介绍:当文件不存在时会创建空文件,当文件存在会清空文件,指针位于开始位置。w只写模式,没有读功能,f.read()会报错

with open('d.txt',mode='wt',encoding='utf-8') as f:
    f.read()   # 报错,w模式不可读,后面的程序不再执行
    f.write('擦勒\n')

强调1:

在以w模式打开文件没有关闭的情况下,连续写入,新的内容总是跟在旧的之后

with open('d.txt',mode='wt',encoding='utf-8') as f:
    f.write('擦勒1\n')
    f.write('擦勒2\n')
    f.write('擦勒3\n')

在这里插入图片描述

强调2:

*如果重新以w模式打开文件,则会清空文件内容

with open('d.txt',mode='wt',encoding='utf-8') as f:
    f.write('擦勒1\n')
with open('d.txt',mode='wt',encoding='utf-8') as f:
    f.write('擦勒2\n')
with open('d.txt',mode='wt',encoding='utf-8') as f:
    f.write('擦勒3\n')

在这里插入图片描述

案例:文件的copy工具

w模式用来创建全新的文件

src_file=input('源文件路径>>: ').strip()
dst_file=input('源文件路径>>: ').strip()
with (open(r'{}'.format(src_file),mode='rt',encoding='utf-8') as f1,
      open(r'{}'.format(dst_file),mode='wt',encoding='utf-8') as f2):
    res=f1.read()   # f1只读
    f2.write(res)   # f2只写

在这里插入图片描述

3、a:只追加写

介绍:在文件不存在时会创建空文档,在文件存在时文件指针会直接调到末尾

with open('e.txt',mode='at',encoding='utf-8') as f:
    # f.read() # 报错,不能读
    f.write('擦嘞1\n')
    f.write('擦嘞2\n')
    f.write('擦嘞3\n')

强调 w 模式与 a 模式的异同:
**1 相同点:**在打开的文件不关闭的情况下,连续的写入,新写的内容总会跟在前写的内容之后
**2 不同点:**以 a 模式重新打开文件,不会清空原文件内容,会将文件指针直接移动到文件末尾,新写的内容永远写在最后;以w模式重新打开文件,会清空原文件内容。

案例:注册功能

a模式用来在原有的文件内存的基础之上写入新的内容,比如记录日志、注册

name=input('your name>>: ')
pwd=input('your name>>: ')
with open('db.txt',mode='at',encoding='utf-8') as f:
    f.write('{}:{}\n'.format(name,pwd))

了解:+不能单独使用,必须配合r、w、a

with open('g.txt',mode='rt+',encoding='utf-8') as f:
    print(f.read())
    f.write('中国')
with open('g.txt',mode='w+t',encoding='utf-8') as f:
    f.write('111\n')
    f.write('222\n')
    f.write('333\n')
    print('====>',f.read())
with open('g.txt',mode='a+t',encoding='utf-8') as f:
    print(f.read())

    f.write('444\n')
    f.write('5555\n')
    print(f.read())
  • 14
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值