什么是文件缓存
操做系统提供的虚拟概念,存储信息(用二进制存储)编码
什么是文件处理操作系统
修改存储的信息指针
文件的绝对路径和相对路径code
D:\Program Files\python\test.py
test.py
项目中尽可能用相对路径。视频
操做文件的流程对象
打开文件图片
f = open('test.py','r',encoding='utf-8') # 以‘r’模式,‘utf-8’格式,打开当前文件夹下的‘test.py’
读取 或 修改文件ip
data = f.read() # 读取文件内的内容给到对象 data
保存文件
f.flush() # 快速保存,能够不使用
关闭文件
f.close() # 告诉操做系统关闭文件
读取: rt
:读文本内容,只读
f = open('test.py','r',encoding='utf-8') data = f.read() # 读取全部文本内容 print(f.readable()) # 判断是否可读 print(f.writable()) # 判断是否可写
运行结果:
True False Process finished with exit code 0
了解
print(f.readline()) # 一行一行读取 print(f.readlines()) # 读取全部行放入列表
循环读出文本内容
for i in f.read(): # 循环出一个个字符 print(i)
for i in f: # 循环出一行行的内容 --->这种方式更节省内存 print(i)
只写: wt
:打开文件后先清空文本内容,再写入新的内容
f = open('test.py','w',encoding='utf-8') print(f.readable()) # 判断是否可读 print(f.writable()) # 判断是否可写
运行结果:
False True Process finished with exit code 0
了解
f.writelines(['abc', 'def', 'ghi']) # 自动拼接列表元素,一行写入
文件内保存为:
abcdefghi
只写: at
:只写,在文件原内容最后面写入新的内容
f = open(r'D:\上海python12期视频\python12期视频\day 09\test.py', 'at', encoding='utf8') print(f.readable()) print(f.writable())
运行结果:
False True Process finished with exit code 0
使用 w
和 a
模式能够自动建立一个新的文件,使用 r
模式时,文件必须是已经存在的。
文件的两种打开方式
两种方式都不单独使用,通常与r/w/a联用
文本方式: t
:打开文本,须要指定字符编码
指定打开的文本文件的模式为 rt 或 wt 或 at
,通常能够省略 t 直接写做 r 或 w 或 a
。
二进制方式: b
:通常用于音频/视频/图片的保存
指定打开的文本文件的模式为 rb 或 wb 或 ab
。
因为每次保存文件后,都须要手动将文件关闭掉,解除对操做系统的占用,比较麻烦,因此python中提供了一种能够自动关闭文件的方法。
语法:
with open('test.py', 'r', encoding='utf8') as f: # print(f.read()) # 在这个缩进下不会关闭文件,在这个缩进下对文件操做 data = f.read() # data放到python的内存中 print(data) # 关闭文件(操做系统),但没有关闭python内存中的文件 print(f.read()) # 因为不在缩进内,操做系统的文件已经关闭,报错
1.三种新的文件打开模式(使文件便可读又可写),尽可能不要使用。
当一个文件便可读又可写的时候,因为读取和写入的时间差,可能出现写入和读取的错误,没法正确的读取到或者写入咱们想要的信息。
可写可读: r+
with open('test.py', 'r+', encoding='utf8') as fr: print(fr.readable()) print(fr.writable()) fr.write('写入内容') # 光标在文件头部,会覆盖后面的字符
运行结果:
True True Process finished with exit code 0
可写可读: w+
: w+
和 w
没有任何区别
with open('test.py', 'w+', encoding='utf8') as fw: print(fw.readable()) print(fw.writable())
运行结果:
True True Process finished with exit code 0
可写可读: a+
:a模式默认光标在尾部
with open('test.py','a+',encoding='utf8') as fa: print(fa.readable()) print(fa.writable()) fa.seek(0,0) # 因为 a 模式打开文件,默认光标在尾部,因此想要读取文件内容必须将光标移动到文件头 print(fa.read())
运行结果:
True True Process finished with exit code 0
综上,若是某些场景真的须要文件可读又可写,应该用两种不一样的模式打开两次文件
2.光标的高级应用(移动文件内的光标)
字节:8个二进制位为一个字节(如下方法都是以字节为单位)
seek()
:移动光标
with open('test.py', 'rb') as fr: fr.seek(3) # 打开文件后,将光标日后移动3个字节(一个中文),默认从开头开始读取 # 若是 seek 移动的字符不够 3 个字节,或恰好将汉字的三个字节切分,则会致使乱码 # whence 参数:规定只有0,1,2 三种模式 fr.seek(3, 0) # 0 表示从开头日后移动 3 个字符,默认为 0 ,能够不写 fr.seek(3, 1) # 1 表示从中间日后移动 3 个字符 fr.seek(3, 2) # 2 表示从开头日后移动 3 个字符 print(fr.read()) print(fr.read().decode('utf8'))
tell()
:告诉当前光标所在的位置
with open('test.py', 'rb') as fr: fr.seek(3, 0) print(fr.tell()) # 从文件开头到当前指针所在位置
运行结果:
3 Process finished with exit code 0
truncate()
:截断
with open('test.py', 'ab') as fa: fa.truncate(2) #截断2个字节后的全部字符,若是3个字节一个字符,只能截断2/3个字符,还会遗留1/3个字符,会形成乱码
字符:3个字节对应一个字符(中文)
read()
:以字符为单位,移动光标
with open('test.py', 'r', encoding='utf8') as fr: print(fr.read(3)) # 3 表示 3 个字符,不加默认读取全部 # 中文和英文都属于一个字符
文件没有修改的说法,只有覆盖。
缓存文件的原理:
import os # 同时打开多个文件 with open('test.py', 'r', encoding='utf-8') as fr, \ open('test_swap.py', 'w', encoding='utf-8') as fw: data = fr.read() data = data.replace('原内容', '修改的内容') # 在新文件里用修改的内容替换掉原来的内容 fw.write(data) os.remove('test.py') # 删除原文件 os.rename('test_swap.py', 'test.py') # 将新的文件重命名为旧文件
可是这样当文件很大的时候,影响效率,下面是改进:
import os # 同时打开多个文件 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('原内容', s) fw.write(i) # fw.flush() # 先保存成功再继续运行 os.remove('test.py') # 删除原文件 os.rename('test_swap.py', 'test.py') # 将新的文件重命名为旧文件
注册功能:
实现代码:
# 注册 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: print('登陆失败')