文件操作、文件读写、及文件的诸多方法
一、文件操作
1.文件的概念
文件:就是操作系统暴露给用户操作硬盘的快捷方式
打开文件,双击时就是从硬盘将数据加载到内存
保存文件,就是将内存中的数据刷到硬盘保存
2.代码打开文件的两种方式
方式1:
f = open(文件路径,读写模式,encoding='utf8')
f.close()
方法2:
with open(r'a.txt', 'r', encoding='utf8')
with子代码
ps:with上下文管理好处在于子代码运行结束自动调用close方法关闭资源
'''
为了解决文件路径跟一些字母组合在一起会产生特殊含义导致路径查找混乱问题,我们在字符串的路径前面加上字母r,就能解决这个问题
C:\a.txt
r'C:\a.txt'
with支持一次性打开多个文件
with open() as f1, open() as f2, open() as f3:
子代码
'''
二、文件读写模式
r read 只读不写
w write 只写不读
a append 只追加,末尾追加
ps:
1.with语法课支持一次性打开多个文件
2.当写代码时,一些部分不知道写什么具体代码也不能空时,可以使用关键字pass或者...
他们两个只补全语法不执行功能,本身没有任何的含义,尽量多使用pass
3.英语单词后面有able,表示有什么能力
1.'r' 只读模式:只能读不能写
读取文件的内容;
with open(r'a.txt', 'r', encoding='utf8') as f:
print(f.read())
2.'w' 只写模式:只能写不能看
# 1.文件不存在时,自动创建
with open(r'b.txt', 'w', encoding='utf8') as f:
pass
# 2.文件路径存在时,先清空原有的文件内容,之后再写入
with open(r'a.txt', 'w', encoding='utf8') as f:
f.write('摆脱拖延症啊啊啊\n')
f.write('摆脱拖延症啊啊啊\n')
f.write('摆脱拖延症啊啊啊\n')
注:数据读取对比的时候一定注意换行符的存在
换行符:\r\n \n \r
3.'a' 只追加模式:文件末尾添加数据
# 1.文件不存在时,自动创建
with open(r'c.txt', 'a', encoding='utf8') as f:
pass
# 2.文件路径存在:自动在末尾等待追加内容
with open(r'a.txt', 'a', encoding='utf8') as f:
f.write('比放七天假更难受的是上七天班')
三、文件操作模式
t 文本模式,默认模式
r rt
w wt
a at
1.t模式只能操作文本文件
2.该模式必须要指定encoding参数
3.该模式的读写都是以字符串为单位
eg:
with open('a.txt') as f:
print(f.write('啊啊啊')) # 报错,提示没有写的能力
b 二进制模式(bytes模式)
没有默认模式,需要自己指定 rb wb ab
1.因为计算机值认识0和1,对计算机而言文件都是二进制类型
2.可以操作任意类型的文件
3.读写都是以bytes为单位
4.不需要指定encoding参数,因为已经是二进制模式了,不需要编码
eg:
with open(r'a.txt', 'rb') as f:
print(f.read()) # b'\xe6\x91\x86\xe8\x84\xb1\xe6\x8b\x96\xe5\xbb\xb6\xe7\x97\x87\xe5\x95\x8a\xe5\x95\x8a\xe5\x95\x8a\xe6\x91\x86\xe8\x84\xb1\xe6\x8b\x96\xe5\xbb\xb6\xe7\x97\x87\xe5\x95\x8a\xe5\x95\x8a\xe5\x95\x8a\xe6\x91\x86\xe8\x84\xb1\xe6\x8b\x96\xe5\xbb\xb6\xe7\x97\x87\xe5\x95\x8a\xe5\x95\x8a\xe5\x95\x8a'
eg:
with open(r'a.txt', 'ab') as f:
f.write('hello') # 报错,提示只能用bytes类型
四、文件诸多方法
1.read() # 一次性读取文件,并且光标停留在问价末尾,继续读则为空
# 当文件较多时,该方法还可能造成计算机内存溢出
# 括号内可以填写数字,文本模式下,表示读取几个字符
eg:
with open(r'a.txt', 'r', encoding='utf8') as f:
print(f.read())
2.for循环
# 当文件过大时,超出自己的内存,不建议一次读取,一行一行的读取文件,避免内存溢出现象
3.readline() # 一次读取一行内容
eg:
with open(r'a.txt', 'r', encoding='utf8') as f:
print(f.readline())
4.readlines() # 一次性读取文件内容,会按照行数组织成列表的一个个数据值
eg:
with open(r'a.txt', 'r', encoding='utf8') as f:
print(f.readlines())
5.readable() # 判断文件是否具备读数据的能力
eg:
with open(r'a.txt', 'r', encoding='utf8') as f:
print(f.readable())
6.write() # 写入数据
eg:
with open(r'a.txt', 'w', encoding='utf8') as f:
f.write('今天不适合出名')
7.writeable() # 判断文件是否具备读数据的能力
eg:
with open(r'a.txt', 'w', encoding='utf8') as f:
print(f.writeable())
8.writelines() # 判断文件是否具备读数据的能力
eg:
with open(r'a.txt', 'w', encoding='utf8') as f:
f.writelines('今天适合学习')
9.flush() # 将内存中文件数据立刻刷到硬盘 等价于ctrl + s
eg:
with open(r'a.txt', 'w', encoding='utf8') as f:
f.writelines('今天适合学习')
f.flush() # 保存文件
五、文件内光标的移动
我们读取文件时,光标会随着读取内容的解释移至内容的末尾,下面有几种方式使文件内的光标随着我们的指令移动:
1.我们在文本模式下读取文件内容时,括号内添加要读取的字符个数,主要换行符也是一个字节
eg:
with open(r'a.txt', 'r', encoding='utf8') as f:
print(f.read(4)) # 今天不适
2.在二进制模式中read()读取内容时括号可添加读取个数,英文一个字节,汉字三个字节起步, 二进制中换行符算两个字节
eg:
with open(r'a.txt', 'rb') as f:
data = f.read(15)
print(data.decode()) # 今天不适合
# 添加读取个数的时候,一定注意汉字三个字节起步,计算错是要报错的
3.tell()能够读取内容的字节数
eg:
with open(r'a.txt', 'rb') as f:
data = f.read(15)
print(data.decode()) # 今天不适合
print(f.tell()) # 15
4.seek(offset,whence)
offset是位移量,以字节为单位
whence是模式,有0,1,2
0是基于文件开头,文本和二进制都可以使用
1是基于当前位置,只有二进制可以使用
2是基于文件末尾,只有二进制模式才能使用
eg:
with open(r'a.txt', 'rb') as f:
print(f.read())
f.seek(0,0)
print(f.read())
f.seek(0, 0)
print(f.read())
六、拷贝方式
通过先读取再将读取的内容写入,(文件不存在时即创建新的文件)可实现文件的复制
# 只能拷贝文本文件
eg:
with open(r'a.txt', 'r', encoding='utf8') as f:
data = f.read()
with open(r'b.txt', 'w', encoding='utf8') as f1:
f1.write(data)
# 可拷贝任意文件
eg:
with open(r'a.txt', 'rb') as f, open(r'b.txt', 'wb') as f1:
data = f1.read()
f1.write(data) # 可以写成 f1.write(f.read())
七、作业
1.编写简易版本的拷贝工具
自己输入想要拷贝的数据路径 自己输入拷贝到哪个地方的目标路径
任何类型数据皆可拷贝
ps:个别电脑C盘文件由于权限问题可能无法拷贝 换其他盘尝试即可
解答:
# 1.获取想要拷贝的文件路径
sources_file = input('请输入您要拷贝的目标文件路径>>>').strip()
# 2.获取目标文件的路径
target_file = input('请输入您要拷贝到的文件路径>>>').strip()
# 3.打开第一个文件路径,读取写入第二个文件路径中
with open(r'%s' % sources_file, 'rb') as f, open(r'%s' % target_file, 'wb') as f1:
for line in f:
f1.write(line)
2.利用文件充当数据库编写用户登录、注册功能
文件名称:userinfo.txt
基础要求:
用户注册功能>>>:文件内添加用户数据(用户名、密码等)
用户登录功能>>>:读取文件内用户数据做校验
ps:上述功能只需要实现一次就算过关(单用户) 文件内始终就一个用户信息
拔高要求:
用户可以连续注册
用户可以多账号切换登录(多用户) 文件内有多个用户信息
ps:思考多用户数据情况下如何组织文件内数据结构较为简单
提示:本质其实就是昨天作业的第二道题 只不过数据库由数据类型变成文件
单用户基础版登录与注册:
注册:
# 1.获取用户的用户名和密码
username = input('请输入您的用户名>>>').strip()
pwd = input('请输入您的密码').strip()
# 2.构造用户名和密码的组合
data = f'{username}|{pwd}'
# 3.打开文件写入数据
with open(r'userinfo.txt', 'w', encoding='utf8') as f:
f.write(data)
登录:
# 1.获取用户名与密码
username = input('请输入您的用户名>>>').strip()
pwd = input('请输入您的密码').strip()
# 2.读取文件内容
with open(r'userinfo.txt', 'r', encoding='utf8') as f:
real_name, real_pwd = f.read().split('|') # 解压赋值,先读数据,然后切割,成列表
# 3.校验用户名和密码
if username == real_name and pwd == real_pwd:
print('登录成功')
else:
print('用户名或者密码有错')
多用户升级版登录与注册:
while True:
print('''
1.注册功能 2.登录功能
''')
choice = input('请输入您要执行的功能编号>>').strip()
if choice == '1':
username = input('请输入您的用户名》》').strip()
pwd = input('请输入您的密码》》').strip()
with open(r'userinfo.txt', 'r', encoding='utf8') as f:
for line in f:
real_name, real_pwd = line.split('|')
if username == real_name:
print('用户名已存在,无法完成注册')
break
else:
with open(r'userinfo.txt', 'a', encoding='utf8') as f2:
f2.write(f'{username}|{pwd}\n')
print(f'用户{username}注册成功')
elif choice == '2':
username = input('请输入您的用户名》》').strip()
pwd = input('请输入您的密码》》').strip()
with open(r'userinfo.txt', 'r', encoding='utf8') as f1:
for line in f1:
real_name, real_pwd = line.split('|')
if username == real_name and pwd == real_pwd.strip('\n'):
print('登录成功')
break
else:
print('登录失败')
else:
print('没有该功能编号')
标签:文件,encoding,utf8,读写,诸多,print,txt,open
From: https://www.cnblogs.com/zx0524/p/16773796.html