目录
文件处理
什么是文件处理
修改存储的信息
什么是文件
操作系统提供的虚拟概念,存储信息(用二进制存储信息)
操作文件的流程
打开文件
①文件路径②打开模式,w--》write③
f = open(r'C:\Users\qndn\PycharmProjects\untitled4\day20\01 文件处理.py','w',encoding='utf8')
修改/读取文件
f.write('''
孩儿立志出湘关,学不成名誓不还
埋骨何须桑梓地,人生无处不青山
''')
保存文件
f.flush() # 快速保存,你可以不适用
关闭文件
f.close()
文件的三种打开模式
读取/清空写入/追加写入
读取
rt --》read_text 读文本内容 只读
f = open(r'D:\上海python12期视频\python12期视频\day 09\test.py', 'rt', encoding='utf8')
f.write('slkdjfklj')
data = f.read()
print(data)
print(f.readable()) # 判断是否可读
print(f.writable()) # 判断是否可写
data = f.read() # 读取所有文本内容
print(data)
# 仅作了解
# print(f.readline()) # 一行一行读取
# print(f.readlines()) # 读取所有行放入列表 # 一筐鸡蛋
# for i in f.read(): # 循环出一个个字符
# print(i)
# for i in f: # 循环出一行行 # 节省内存 # 老母鸡下蛋
# print(i)
# 文本读一行少一行,每一行末尾默认有一个换行
# for i in f:
# print(i)
清空写入
wt:只写(w空空文件后写入),不可读
# 仅作了解
# f.writelines(['abc', 'edf', 'gbk']) # 自动拼接列表元素,一行写入
追加写入
at:只写入
打开文件的两种方式
t-->文本;b-->二进制模式:这两种东西不单独使用,一般与r/w/a联用,不需要coding
b模式一般用于图片/音频/视频的保存
w和a模式可以自动创建文件
绝对路径和相对路径
文件的路径
文件在硬盘的地址
绝对路径
从盘符开始 D:
相对路径
执行文件(当前运行的文件)的文件夹下的文件名,执行文件和打开文件属于同一文件夹下
项目尽量用相对路径
with管理文件上下文
with提供一个自动关闭文件(解除了操作系统的占用)
with open('test.py', 'r', encoding='utf8') as f:
#在这个缩进下不会关闭文件,在这个缩进下对文件操作
data = f.read()
print(data)
# 关闭文件(操作系统),没有关闭python、内存中的文件
print(f) # 只涉及python
# print(f.read()) # 设计操作系统,报错
文件的高级应用
全部仅作了解
三种新的方式(可读又可写),尽量不要使用
可写可读 r+
with open('test.py', 'r+', encoding='utf8') as fr:
# print(fr.readable())
# print(fr.writable())
fr.write('高级') # 光标在文件头部,覆盖后面的字符
可写可读 w+
和 w 没有任何区别
with open('test.py', 'w+', encoding='utf8') as fw:
print(fw.readable())
print(fw.writable())
可写可读 a+
a模式默认光标在尾部
with open('test.py','a+',encoding='utf8') as fw:
print(fw.readable())
print(fw.writable())
fw.seek(0,0)
print(fw.read())
需要了解的
8个二进制位为一个字节,3个8进制位组成一个字符(针对中文,英文是一个字节一个字符)
seek
with open('test.py', 'rb') as fr:
fr.seek(5) # 移动了3个字节,一个中文,默认从开头开始
print(fr.read())
print(fr.read().decode('utf8'))
whence
规定只有0,1,2三种模式 # 0相当于文件头开始;1相当于当前文件所在位置;相当于文件末尾
fr.seek(3, 0) # 0从开头
# print(fr.read().decode('utf8'))
fr.seek(3, 1)
print(fr.read().decode('utf8'))
fr.seek(0, 2)
print(fr.read())
tell
告诉你当前所在的位置
with open('test.py', 'rb') as fr:
fr.seek(3, 0)
print(fr.tell())
truncate
截断
with open('test.py', 'ab') as fa:
fa.truncate(2)
read
移动光标(以字符为单位)
with open('test.py', 'r', encoding='utf8') as fr:
print(fr.read(3)) # n表示n个字符,不加默认读取所有 # 中文和英文都属于一个字
登录注册
注册
count = 0
while count < 3:
username_inp = input('请输入你的用户名:')
pwd_inp = input('请输入你的密码:')
re_pwd_inp = input('请在此输入你的密码:')
if not pwd_inp == re_pwd_inp:
print('两次密码输入不一致')
count += 1
continue
with open('user_info.txt', 'a', encoding='utf8') as fa:
fa.write(f'{username_inp}:{pwd_inp}\n') # :表示用户名和密码的分割;|用户和用户之间的分割
fa.flush()
break
登录
username_inp = input('请输入你的用户名:')
pwd_inp = input('请输入你的密码:')
with open('user_info.txt', 'r', encoding='utf8') as fr:
for user_info in fr:
username, pwd = user_info.split(':')
if username.strip() == username_inp and pwd.strip() == pwd_inp: # strip可以去掉两端的换行符
print('登录成功')
break
# else:
# continue # continue一般不写在最后一行
else:
print('登录失败')
文件的修改
文件其实没有修改一说,只有覆盖