【python基础】第13回 文件处理 模式与方法

本章内容概要

文件的读写模式

文件的操作模式

文件操作的诸多方法

文件拷贝

本章内容详情

1.文件的读写模式

1.1 补充知识

1.with 语法支持一次性打开多个文件

with open( r'a.txt', 'r', encoding='utf8') as f1,open(r'b.txt', 'r', encoding='utf8') as f2:
    pass

2.补全python 语法 但是不执行任何操作

       pass 推荐使用

       ...不推荐使用

3.通常情况下英语单词的结尾如果加上了able 表示具备该单词描述的能力

       readable 具备读取内容的能力

       writable   具备填写内容的能力

1.2   r   只读模式  默认的模式

使用该模式打开的文件只能读取内容 不能做其他操作(如 写)

1.文件路径不存在:r模式直接报错

with open(r'a.txt', 'r', encoding='utf8') as f1:
    pass

 2.文件路径存在:r 模式会打开文件等待读取文件内容

with open(r'a.txt', 'r', encoding='utf8') as f1:
    print(f1.read())

1.3   w  只写模式

使用该模式打开的文件只能写内容 不能做其他操作(如读)

1.文件路肩不存在:w模式会自动创建该文件

with open(r'b.txt', 'w', encoding='utf8') as f:
    pass

2.文件路径存在:w模式会先清空该文件内容 之后等待填写新内容

with open(r'a.txt', 'w', encoding='utf8') as f:
    pass

1.4   a  只追加模式

使用该模板打开的文件默认是在末尾追加新的内容 不能做其他操作(如 读)

1.文件路径不存在:a 模式会自动创建文件

with open(r'c.txt', 'a', encoding='utf8') as f:
    pass

 2.文件路劲存在: a 模式不会先清空该文件内容 只在文件末尾等待填写新的内容

with open(r'a.txt', 'a', encoding='utf8') as f:
    f.write('追加\n')

2.文件的操作模式

2.1 t  文本模式

       文件操作的默认模式

       r     rt

       w     wt

       a     at 

1.只能操作文本文件

2.必须指定encoding参加

3.读写都是以字符串为单位

2.2 b 二进制模式

rb wb ab  必须自己指定 不能省略

1.能够操作所有类型的文件

2.不需要指定encoding参数

3.读写都是以bytes为单位

3.文件操作的诸多方法

3.1 read()

一次性读取文件内容并且光标会停留在文件末尾 继续读则为空

例; 当文件数据较大的时候 不推荐一次性读取

100G 的文件 16G读取 用 循环读取

with open(r'a.txt', 'r', encoding='utf8') as f:
    for i in f:
        print(i)

with open(r'a.txt', 'r', encoding='utf8') as f:
    data = f.read()  # 一次性读取文件
    print(data)
    data1 = f.read()  # 读完 文件光标到末尾 后面无内容
    print(data1)

3.2 readline() 一次只读一行内容

with open(r'a.txt', 'r', encoding='utf8') as f:
    data = f.readline()
    print(data)
    data1 = f.readline()
    print(data1)

3.3 readlines() 按照行的方式读取所有的内容并组织成列表返回

with open(r'a.txt', 'r', encoding='utf8') as f:
    data = f.readlines()
    print(data)

3.4 readable() 判断当前文件是否可读

3.5 writable() 判断当前文件是否可写

with open(r'a.txt', 'r', encoding='utf8') as f:
    # data = f.readlines()
    # print(data)
    print(f.readable())  # Ture
    print(f.writable())  # False

3.6 write() 填写内容

with open(r'b.txt', 'w', encoding='utf8') as f:
   f.write('填写')

3.7 wrutelines() 支持填写容器类型(内部可以存放多个数据值的数据类型)多个数据值

with open(r'b.txt', 'w', encoding='utf8') as f:
   f.writelines(['zhang\n', 'jason\n', 'li\n'])

3.8 flush() 将内存中的文件数据立刻刷到硬盘(主动按ctrl+s)

with open(r'b.txt', 'w', encoding='utf8') as f:
    f.flush()  # 将内存中的文件数据立刻刷到硬盘(主动按ctrl+s)

4.文件拷贝

4.1 文本拷贝

# 拷贝功能
with open(r'a.txt', 'r', encoding='utf8') as f: data = f.read() with open(r'aaa.txt', 'w', encoding='utf8') as f: f.write(data)

4.2 二进制拷贝

with open(r'pp.png', 'rb') as read_if,open(r'22.png', 'wb') as write_if:
    data = read_if.read()
    write_if.write(data)

作业

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

path = input('请输入要拷贝的路径>>:').strip()
with open(fr'{path}', 'rb') as read_if:
    data = read_if.read()
path_copy = input('请输入要拷贝到路径>>:').strip()
with open(fr'{path_copy}', 'wb') as write_if:
    write_if.write(data)


# 1.先获取想要拷贝的数据路径
# source_file_path = input('请输入想要拷贝的数据路径>>>:').strip() # a.txt
# # 2.再获取拷贝到哪个地方的目标路径
# target_file_path = input('请输入拷贝到哪个地方的目标路径>>>:').strip() # b.txt
# # 3.读取想要拷贝的数据路径对应的内容 并写入到目标路径中
# """
# 1.合并代码
# 2.路径如何添加r取消转移
# """
# with open(r'%s' % source_file_path, 'rb') as f1, open(r'%s' % target_file_path, 'wb') as f2:
# for line in f1: # 循环读取文件中一行行内容
# f2.write(line) # 依次写入新的文件
 

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

username = input('请注册你的用户名>>:').strip()
password = input('请设置你的密码>>:').strip()
with open(r'userinfo.txt', 'w', encoding='utf8') as write_user:
    write_user.writelines({f'{username},{password}'})
    print('注册成功')
with open(r'userinfo.txt', 'r', encoding='utf8') as read_user:
    data = read_user.read().split(',')
name = input('请登录你的用户名>>:').strip()
word = input('请输入你的密码>>:').strip()
if name == data[0] and word == data[1]:
    print('登录成功')
else:
    print('账号或密码错误')



# while True:
# print("""
# 1.注册功能
# 2.登录功能
# 3.退出程序
# """)
# func_id = input('请输入功能编号>>>:').strip()
# if func_id == '1':
# # 1.获取用户名
# username = input('请输入用户名>>>:').strip()
# # 2.判断当前用户名是否已存在
# # 2.1.读取数据文件
# with open(r'userinfo.txt', 'r', encoding='utf8') as f:
# # 2.2.循环获取文件内容(一个个用户数据)
# for line in f: # jason|123 kevin|321 tony|222
# # 2.3.拆分出真实用户名 比对
# real_name = line.split('|')[0]
# # 2.4.判断用户名书否已存在
# if username == real_name:
# print('用户名已存在')
# break
# else:
# # 一定要理解循环与break continue else的组合使用
# password = input('请输入密码>>>:')
# # 3.构造用户数据
# user_data = '%s|%s\n' % (username, password)
# # 4.打开并写入文件
# with open(r'userinfo.txt', 'a', encoding='utf8') as f:
# f.write(user_data)
# # 5.温馨提示
# print(f'用户{username}注册成功')
# elif func_id == '2':
# # 1.获取用户数据
# username = input('username>>>:').strip()
# password = input('password>>>:').strip()
# # 2.读取文件内容
# with open(r'userinfo.txt', 'r', encoding='utf8') as f:
# # 2.1.循环读取每个真实用户的数据
# for line in f: # oscar|666 jerry|789
# # 2.2.拆分真实用户名和密码
# real_name, real_pwd = line.split('|') # 注意密码后面有换行符
# # 2.3.判断用户输入的数据与真实数据是否一致
# if username == real_name and password == real_pwd.rstrip('\n'):
# print('登录成功')
# break
# else:
# print('用户名或密码错误')
# elif func_id == '3':
# print('欢迎下次再来哦')
# break
# else:
# print('输入不合法!!!')

 

posted @ 2022-06-29 22:25  |相得益张|  阅读(50)  评论(0编辑  收藏  举报