一、文件处理:
什么是文件处理 :修改存储的信息
什么是文件 :操作系统提供的虚拟概念,存储信息(用二进制存储信息)
操作文件的流程 :
1.打开文件(格式:文件路径+打开模式+字符编码)
f=open(r'K:\Python课程\day8\01 文件处理.py','w',encoding='utf8')
2.修改/读取文件
f.write(''' 孩儿立志出湘关,学不成名誓不还 埋骨何须桑之地,人生无处不青山 ''')
3.保存文件
f.flush() #快速保存,可以不使用
4.关闭文件:Python通过操作系统操作文件
f.close() #告诉操作系统关闭文件 #import os #os.remove(r'K:\Python课程\day8\01 文件处理.py')
二、文件的三种打开方式:
读取/写入/追加写入
1.读取:rt --》 read_text 读文本内容,只读
f=open(r'K:\Python课程\day8\test.py','rt',encoding='utf8') f.write('sjswnsb') data=f.read() #读取所有文本内容 print(data) print(f.readable()) print(f.writable()) #not writable print(f.readline()) #一行一行读取 print(f.readlines()) #读取所有行加入列表
要循环读出文本内容
for i in f.read(): #循环出一个个字符 print(i) for i in f: #循环出一行行,节省内存 print(i)
文本读一行少一行,每一行末尾默认有一个换行
2.wt:只写(w清空文件后写入),不可读
f=open(r'K:\Python课程\day8\test.py','wt',encoding='utf8') #清空文件 print(f.readable()) #False print(f.writable()) #True f.write('abc') #写入abc f.writelines(['abc','def','gbk']) #自动拼接列表元素,一行写入
3.at:只写入(追加写入)
f=open(r'K:\Python课程\day8\test.py','at',encoding='utf8') print(f.readable()) #False print(f.writable()) #True f.write('中')r--只读;w--清空写入;a--追加写入
encoding指定写入的编码格式
f=open(r'K:\Python课程\day8\test.py','at',encoding='gbk') f.write('中')
encoding指定读文件的编码格式
f=open(r'K:\Python课程\day8\test.py','rt',encoding='gbk') print(f.read)
打开文件的两种方式
t-->文本;b-->二进制模式:这两个不单独使用,须和r\w\a,不需要encoding.f=open(r'K:\Python课程\day8\test.py','rb') print(f.read()) #运行结果,前面一个b然后引号b模式一般用于图片/音频/视频的保存
import requests response=request.get('http://photocdn.sohu.com/20120708/Img347586981.jpg') data=response.content #拿到图片的二进制 print(data)w和a模式可以自动创建文件
f=open(r'K:\Python课程\day8\test.py','wb') f.write(data)
三、绝对路径和相对路径
文件的路径:文件在硬盘的地址
绝对路径:从盘符开始,比如:K:\Python课程\day8\test.py
相对路径:执行文件(当前运行的文件)的文件夹下的文件名,执行文件和打开文件属于同一文件夹下
写项目尽量常用相对路径:
f=open('test.py','r',encodng='utf8') print(f.read()) f.close()
四、with管理文件上下文
with提供一个自动关闭文件(解除了操作系统的占用)
with open('test.py','r',encoding='utf8') as f: #print(f.read()) #在这个缩进下不会关闭文件,在这个缩进下对文件操作 data=f.read() #data放到Python的内存中 print(data) #关闭文件(操作系统),没有关闭Python内存中的文件 print(f) #只涉及Python #print(f.read()) #涉及操作系统,报错
五、文件的高级应用
1.可读又可写(r+),尽量不要使用
with open('test.py','r+',encoding='utf8') as fr: print(fr.readable()) print(fr.writable()) fr.write('高级') #光标在文件头部,从左到右依次覆盖原有的字符,剩下的字符就剩下了
2.可写可读w+和w没有任何区别
with open('test.py', 'w+', encoding='utf8') as fw: #清空 print(fw.readable()) #已经没有意义,读之前已经清空 print(fw.writable())
3.可读可写 a+ a模式默认光标在尾部
with open('test.py','a+',encoding='utf8') as fw: print(fw.readable()) print(fw.writable()) fw.seek(0,0) #光标移动到首部再读 print(fw.read())
综上:如果你真的有即可读又可写的需求,用两种不同的模式打开两次文件
4.光标的高级应用(移动光标)
8个进制位为一个字节,3个8进制位组成一个字符(针对中文,英文是一个字节一个字符)
(00000000-->一个字节 00000000 00000000) --> 一个字符,对应三个字节,对应一个中文 --> utf8
以下三种移动光标的位置(以字节/二进制为单位)
1.#seek (还得知道文本内容每个字符有几个字节) with open('test.py', 'rb') as fr: fr.seek(6) #移动了3个字节,一个中文,默认从开头开始 #print(fr.read()) #读出来是二进制 print(fr.read().decode('utf8')) #转码
whence规定只有0,1,2 三种模式 .
0相当于文件头开始;1相当于当前文件所在位置;2相当于文件末尾
#test内容:中国anajbs fr.seek(3, 0) # 开始跳过3个字节,然后开始寻找 print(fr.read().decode('utf8')) #国anajbs fr.seek(3, 1) print(fr.read().decode('utf8')) #从'中'开始寻找,下面的内容跳过3个字节,然后开始寻找 结果是anajbs fr.seek(0, 2) print(fr.read()) #读出为空tell : 告诉你当前所在位置
with open('test.py', 'rb') as fr: fr.seek(3, 0) print(fr.tell()) #3
truncate: 截断
with open('test.py', 'ab') as fa: fa.truncate(3) #中
4.#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(':') print(user_info.split(':')) if username.strip()==username_inp and pwd.strip()==pwd_inp: #strip可以去掉两端的换行符 print('登录成功') break else: print('登录失败')