目录
文件处理
什么是文件
操作系统提供的虚拟的概念,存储信息(用二进制存)
操作文件流程
打开文件
f = open(r'文件路径','文件打开模式',encoding = '字符编码') # r 的作用是让文件路径里的/无效化,只是当作字符处理
f = (r'D:\python\文件处理\test.txt','r',encoding = utf8) # 如果没有这个r 文件路径中的\t就会被当作缩进,使文件路径失效
修改文件
保存文件
关闭文件
文件打开的三种模式
只读
r :读取 read的缩写,读取文本的内容,只读
f.read() 读取文件全部内容
f = (r'D:\python\文件处理\test.txt','r',encoding = utf8)
f.read()
f.readline() 一行一行的读
f = (r'D:\python\文件处理\test.txt','r',encoding = utf8)
f.readline()
f.readlines() 读取所有行放入列表,把所有行都要拿出来,不能分段处理
f = (r'D:\python\文件处理\test.txt','r',encoding = utf8)
f.readline()
对于 逐行读取而言完全可以用for循环
for i in f.read:
print(i)# 循环每一个字符
for i in f:
print(i)# 循环每一行
文本读一行少一行,每一行末尾默认有一个换行
for i in f:
print(i)
print('f.readline():',f.readline())
清空后写入
w:write 只写(清空后写入),不可读
f = (r'D:\python\文件处理\test.txt','r',encoding = utf8)
f.write()
f. writelines() 自动拼接列表元素,一行写入
print(f. writelines(['abc','def']) ) # abcdef
追加写入
a: 只写入(追加写入)不可读
*w和a模式可以自动创建文件
打开文件的两种方式
t—–>打开文本文件
b—–>打开二进制文件,一般用于图片/音频/视频的保存
这两个东西一般单独使用,一般与r/a/w连用
绝对路径和相对路径
绝对路径:
从盘符开始如D:\python\文件处理\test.txt
相对路径:
执行文件(当前运行文件)的文件夹下面的文件名,执行文件和打开文件同属于一个文件夹
未来写项目的时候尽量使用相对路径,一般都是再Windows上写代码,再部署到Linux系统上,相对路径不容易丢失
with管理文件上下文
为了方便使用,with提供了关闭文件的方式
with open(r'D:\python\文件处理\test.txt','r',encoding = utf8)as f:
print(f.read())
with 打开文件下面会有个缩进,对文件的操作要写再缩进里,在这个缩进下文件不会关闭
with 关闭文件并不会解除文件在python中的内存占用,只会关闭操作系统中的文件,还是可以通过变量名打印出来它的类型
with open(r'D:\python\文件处理\test.txt','r',encoding = utf8)as f:
print(f.read())
print(f) # <_io.TextIOWrapper name='test.txt' mode='r' encoding='utf8'>
文件的高级应用
仅作了解,因为并不会用到
r+
可读可写
光标在文件的头部,写入会覆盖后面的字符
w+
w+ 和w 并有什么区别
a+
可读可写
a模式默认光标在文件尾
通过对以上三种方式的了解,如果有可读可写的需求,可以用两种方式打开两次文件
光标的高级应用
8个进制位为一个字节,3个8进制位组成一个字符(针对中文,英文是一个字节一个字符)
(00000000-->一个字节 00000000 00000000) --> 一个字符,对应三个字节,对应一个中文 --> utf8
三种移动光标的位置(以字节为单位)
seek
with open('test.py', 'rb') as fr:
fr.seek(5) # 移动了3个字节,一个中文,默认从开头开始
print(fr.read())
print(fr.read().decode('utf8'))
whence
0相当于文件头开始;1相当于当前文件所在位置;2相当于文件末尾
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)
文件的修改
文件没有修改一说,只能覆盖
缓存文件的原理
# 同时打开多个文件
with open('test.py', 'r', encoding='utf8') as fr, \
open('test_swap.py', 'w', encoding='utf8') as fw:
data = fr.read()
data = data.replace('sb', '傻逼')
fw.write(data)
import os
os.remove('test.py')
os.rename('test_swap.py', 'test.py')
with open('test.py', 'r', encoding='utf8') as fr, \
open('test_swap.py', 'w', encoding='utf8') as fw:
# 再大的文件都能修改
for i in fr:
s = '傻逼'
i = i.replace('sb', s)
fw.write(i)
简单的登录注册
# 注册
print('注册功能')
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(f'user_info.txt', 'a', encoding='utf8') as fa: # 将用户名密码保存到文件里
fa.write(f'{username_inp}:{pwd_inp}\n')
fa.flush() # 刷新,先保存再运行
break
# 登录
print('登录功能')
username_inp = input('请输入你的用户名:')
pwd_inp = input('请输入你的密码:')
with open(f'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:
print('登陆成功')
break
else:
print('登录失败')