Python学习路程——Day09
Python学习路程——Day09
文件操作
1、文件的概念
'''
操作系统为了使用户更好的使用计算机,而创建的一个快捷方式。
双击一个文件,相当于把硬盘的数据资源加载到内存中。
'''
2、打开文件的方法
'''
变量名 = open('文件路径', ’读写模式', encoding = 'utf8')
变量名.close
'''
f = open(' ', ' ', encoding = 'utf8')
print(f.read())
f.close()
'''
with 上下文管理
with open('文件路径', ’读写模式', encoding = 'utf8') as f:
print(f.read())
with上下文管理的好处在于:
当with的子代码结束后,自动调用close()方法,结束文件的调用。
也支持同时打开多个文件
文件路径:在程序处于同一个文件夹下,可以之间文件名+文件后缀打开,如果不在同一个文件夹下,需要写绝对路径打开。
注意:
由于\在代码中有特殊含义,故在写绝对路径前使用 r
'''
with open(r'D:\示例.txt', 'r', encoding = 'utf8') as f:
print(f.read())
3、文件读写模式
'''
'r': 只读:只能读不能写
'w':只写:只能写不能读
'a':只追加:文件末尾添加数据
'''
4、pass 和 ...
'''
只补全语法结构,没有实际含义
'''
5、文件操作模式
'''
t 文本模式(rt、wt、at)
特点:
1、只能操作文本文件
2、读写都是以字符为单位
3、需要指定encoding参数,如果不采用使用计算机默认的编码
b 二进制模式(bytes模式)(rb、wb、ab)
不是默认的模式,需要指定
特点:
1、可以操作任何类型的文件
2、读写都是以字节(bytes)为单位
3、二进制模式、不需要指定编码参数
前面加b直接转为二进制,只有字母和数字
'''
6、编码、解码
'''
编码:
res = '字符串'
data = bytes(res, 'utf8') # encode()
解码:
ret = str(data, '')
'''
7、.read()方法
'''
.rede()方法:
一次性读取文件内容,光标从头读到尾
在同一次的操作中,多次读取,
文件内容过大时,可能会造成内存溢出
read()括号内,可以填写数字,在文本模式下表示读取多少个字符。
'''
8、for循环读文件
'''
一行行读取文件内容 避免内存溢出现象的产生
'''
9、.readline()方法
'''
一次性读取所有文件内容,会根据行数组成列表
读取所有行并返回列表,若给定sizeint>0,返回总和大约为sizeint字节的行, 实际读取值可能比 sizeint 较大, 因为需要填充缓冲区。
'''
['study hard and make progress every day\n', 'study hard and make progress every day\n', 'study hard and make progress every day\n', '很开心见到了你']
10、.readable()方法
'''
判断文件是否具备读数据的能力会返回true和false
'''
11、write()方法
'''
将字符串写入文件,返回的是写入的字符长度。
'''
12、writeable()方法
'''
判断文件是否具备写数据的能力true和false
'''
13、writlines()方法
'''
向文件写入一个序列字符串列表,如果需要换行则要自己加入每行的换行符。
'''
14、flush()方法
'''
刷新文件内部缓冲,直接把内部缓冲区的数据立刻写入文件, 而不是被动的等待输出缓冲区写入。
'''
光标移动
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())
print(f.tell())#返回光标距离文件开头产生的字节数
seek(offset,whence)
offset 是位移量 以字节为单位
whence 是模式 0 1 2
0是基于文件开头:文本和二进制模式都可以用
1是基于当前位置:二进制模式可以用
2是基于文件末尾:二进制模式可以用
使用encode 编码
decode 解码
练习:
1.编写简易版本的拷贝工具
自己输入想要拷贝的数据路径 自己输入拷贝到哪个地方的目标路径
任何类型数据皆可拷贝
ps:个别电脑C盘文件由于权限问题可能无法拷贝 换其他盘尝试即可
soure_file_path = input('拷贝文件路径').strip()
target_file_path =input('目标路径').strip()
with open(r'%s' % source_file_path, 'rb') as read_f, open(r'%s' % target_file_path, 'wb') as write_f:
for line in read_f:
writr_f.write(lin)
2.利用文件充当数据库编写用户登录、注册功能
文件名称:userinfo.txt
基础要求:
用户注册功能>>>:文件内添加用户数据(用户名、密码等)
用户登录功能>>>:读取文件内用户数据做校验
ps:上述功能只需要实现一次就算过关(单用户) 文件内始终就一个用户信息
拔高要求:
用户可以连续注册
用户可以多账号切换登录(多用户) 文件内有多个用户信息
ps:思考多用户数据情况下如何组织文件内数据结构较为简单
提示:本质其实就是昨天作业的第二道题 只不过数据库由数据类型变成文件
while True:
print("""
1.注册功能
2.登录功能
""")
choice = input('请选择您想要执行的功能编号>>>:').strip()
if choice == '1':
username = input('please input your username>>>:').strip()
password = input('please input your password>>>:').strip()
# 2.校验用户名是否已存在
with open(r'userinfo.txt', 'r', encoding='utf8') as f:
for line in f: # 'jason|123'
real_name, real_pwd = line.split('|')
if username == real_name:
print('用户名已存在 无法完成注册')
break # 一旦重复 没有必要继续往下校验是否重复了 直接结束循环
else:
with open(r'userinfo.txt', 'a', encoding='utf8') as f1:
f1.write(f'{username}|{password}\n')
print(f'用户{username}注册成功')
elif choice == '2':
# 1.获取用户名和密码
username = input('please input your username>>>:').strip() # 'jason'
password = input('please input your password>>>:').strip() # '123'
# 2.打开文件读取内容并校验
with open(r'userinfo.txt', 'r', encoding='utf8') as f:
for line in f: # 'jason|123\n'
real_name, real_pwd = line.split('|') # 'jason' '123\n'
if real_name == username and real_pwd.strip('\n') == password:
print('登录成功')
break
else:
print('用户名或密码错误')
else:
print('没有该功能编号')