09 文件处理

一、文件操作的基本流程

     1.基本流程   

1)打开文件,由应用程序向操作系统发起调用open(),操作系统打开该文件,对应一块硬盘空间,并返回一个文件对象赋值给一个变量f
  f=open("a.txt",mode="rt",encodind="utf-8")
 (2)调用文件对象下的读写方法,会被操作系统转换为读/写硬盘的操作
   date=f.read()
 (3)向操作系统发起关闭文件的请求,回收系统资源
   f.close()

2.with

   (1) 在执行完子代码块后,with会自动执行f.close()

with open('db.txt',mode='rt',encoding='utf-8') as f:
    print(f.read())
    print('='*50)
    print(f.read())

(2)可用用with同时打开多个文件,用逗号分隔开即可

 with open('db.txt',mode='rt',encoding='utf-8') as f,\
         open('b.txt',mode='rt') as f1:
     print(f.read())
     print('='*50)
     print(f.read())

二、文件的操作模式

1.控制文件读写内容的模式

   (1) t模式的使用:(默认)

    1. 读写文件都是以字符串为单位的

    2. 只能针对文本文件

    3. 必须指定encoding参数

   (2) b模式的使用;

            1.读写文件都是以bytes/二进制为单位的

    2. 可以针对所有文件

    3. 一定不能指定encoding参数

2.控制文件读写操作的模式

(1)r模式的使用:只读模式

文件不存在则报错,如果文件存在则指针置于文件开头
with open("a.txt",mode="rt",encoding="utf-8") as f:
    print(f.read())

小练习:

实现用户认证功能
inp_user = input("请输入您的名字").strip()
inp_pwd = input("请输入您的密码").strip()
f=open(r"a.txt",mode="rt",encoding="utf-8")
for line in f:
    user,pwd=line.strip("\n").split(":")
    if inp_user == user and inp_pwd == pwd:
        print("登录成功")
        break
else:
    print("登录失败")
f.close()

(2)w模式的使用:只写模式

在文件不存在时创建空文档,文件存在会清空文件,文件指针会跑到文件的开头
with open("b.txt",mode="wt",encoding="utf-8") as f:
     f.write('你好\n')
     f.write('我好\n') 
     f.write('大家好\n')
     f.write('111\n222\n333\n')
强调:
 1 在文件不关闭的情况下,连续的写入,后写的内容一定跟在前写内容的后面
 2 如果重新以w模式打开文件,则会清空文件内容

(3)a模式的使用:只写(追加)

a只追加写模式: 在文件不存在时会创建空文档,文件存在会将文件指针直接移动到文件末尾
with open(“c.txt",mode="at",encoding="utf-8") as f:
    f.write("444\n")
    f.write("555\n")
强调 w 模式与 a 模式的异同:
 1 相同点:在打开的文件不关闭的情况下,连续的写入,新写的内容总会跟在前写的内容之后
 2 不同点:以 a 模式重新打开文件,不会清空原文件内容,会将文件指针直接移动到文件末尾,新写的内容永远写在最后
案例:实现注册功能
name = input("username===>").strip()
pwd = input("password===>").strip()
with open("a.txt",mode="a",encoding="utf-8") as f:
info=("%s:%s\n"%(name,pwd))
f.write(info)

 三、修改文件的2种方式:
# 思路一:
# with open('b.txt',mode='rt',encoding='utf-8') as f1:
# data = f1.read()
# res = data.replace('egon','EGON')
#
# with open('b.txt',mode='wt',encoding='utf-8') as f2:
# f2.write(res)


# 思路二
import os

with open('b.txt',mode='rt',encoding='utf-8') as f1,open('.b.txt.swp',mode='wt',encoding='utf-8') as f2:
for line in f1:
f2.write(line.replace('EGON','egon'))

os.remove('b.txt')
os.rename('.b.txt.swp','b.txt')

练习:

 

# 注册

# inp_user = input("请输入您的用名:").strip()
# inp_pwd = input("请输入您的密码:").strip()
# inp_money = input("请输入您的余额:").strip()
#
# with open('db.txt', mode='at', encoding='utf-8') as f:
#     f.write('%s:%s:%s\n' % (inp_user, inp_pwd, inp_money))



# 转账
import os

with open('db.txt',mode='rt',encoding='utf-8') as f1,open('.db.txt.swp',mode='wt',encoding='utf-8') as f2:
    for line in f1:
        user,pwd,money = line.strip('\n').split(':')
        if user == 'tom':
            money = int(money) - 100
        elif user == 'lili':
            money = int(money) + 100

        line = "%s:%s:%s\n" % (user, pwd, money)
        f2.write(line)

os.remove('db.txt')
os.rename('.db.txt.swp','db.txt')

 

四、文件读写的其他方式

with open('b.txt',mode='rt',encoding='utf-8') as f:
      print(f.readable())
      print(f.readline())
      print(f.readline())
      lines = f.readlines()
     print(lines[0])
 
 
 with open('b.txt', mode='wt', encoding='utf-8') as f:
      print(f.writable())

      lines = ['你好\n', '我好\n', '大家好\n']
      for line in lines:
          f.write(line)
      f.writelines(lines)

     f.write('1111\n222\n333\n')

     f.write('hello')
      f.writelines('hello')

 with open('b.txt', mode='at', encoding='utf-8') as f:
     f.truncate(3) 

五、控制文件指针移动

 储备知识:只有t模式下的read(n)的n代表的是字符个数,除此以外都代表字节个数
 with open('b.txt',mode='rt',encoding='utf-8') as f:
     print(f.read(4))


 with open('b.txt',mode='rb') as f:
     print(f.read(3).decode('utf-8'))


 f.seek(移动的字节个数,模式)
 模式:
 0:参照文件开头,只有0模式可以在t下使用,其他的都只能在b下使用
 with open('b.txt',mode='rt',encoding='utf-8') as f:
     f.seek(3,0)
     f.seek(6,0)
     print(f.tell())

 1:参照指针当前所在的位置,只能在b下使用
 with open('b.txt',mode='rb') as f:
     f.seek(3,1)
     f.seek(6,1)
     print(f.tell())

 2:参照指针文件末尾,通常是倒着移动,只能在b下使用
 with open('b.txt',mode='rb') as f:
     f.seek(-5,2)
     f.seek(-8,2)
     print(f.tell())
     print(f.read().decode('utf-8'))

 

posted @ 2021-08-04 18:36  甜甜de微笑  阅读(52)  评论(0编辑  收藏  举报