day 09 小结
1.文件处理
什么是文件处理:修改储存的信息
什么是文件:操作系统提供的虚拟概念,存储信息(用二进制储存信息)
操作文件的流程:
1. 打开文件# ①文件路径②打开模式,w-->write③
print('D:\上海python12期视频\python12期视频\day 09\test.py')#
print('D:\上海python12期视频\python12期视频\day 09\\test.py') # \\t--》第一个\会让第二个\失去意义
print(r'D:\上海python12期视频\python12期视频\day 09\test.py') #r会让内部所有的\失效
f = open(r'D:\上海python12期视频\python12期视频\day 09\test.py','w',encoding='utf8')
修改/读取文件
f.write('''
孩儿立志出湘关,学不成名誓不还
埋骨何须桑之地,人生无处不青山
''')
保存文件
f.flush() # 快速保存,你可以不使用
关闭文件:python通过操作系统操作文件
f.close() # 告诉操作系统关闭文件
2.文件的三种打开模式
读取/写入/追加写入
1 文件打开模式之r模式
r:read,只读模式,只能读不能写,文件不存在时报错。
f = open('32.txt', mode = 'r') # 报错
f.write()
f.close
# rt : read by text
# windows 的操作系统默认编码为gbk,因此需要utf8编码
f = open('32.txt', mode='rt', encoding='utf8')
data = f.read()
print(data)
print(f"type(data): {type(data)}"")
f.close()
# rb : read by bytes
f = open('32.txt', mode = 'rb')
data = f.read()
print(data)
print(f"type(date): {type(data)}")
f.close()
f.read()读取文件指针会跑到文件的末端,如果再一次读取,读取的将是空格
f = open('32.txt', mode ='rt',encoding='utf8')
data1 = f.read()
data2 = f.read()
print(f"data1:{data1}")
print(f"data2:{data2}")
f.close()
由于f.read()一次读取文件的所有内容,如果文件非常大,可能会造成内存爆掉,即电脑卡死。因此可以用f.readline()/f.readlines()读取内容
# f.readline()/f.readlines
f = open('32.txt',mode='rt', encoding='utf8')
print(f"f.readable();{f.readable)}") # 判断文件是否可读
data1 = f.readline()
data2 = f.readlines()
2 文件打开模式之w模式
w:只能写,不能读,文件存在的时候会清空文件后再写入内容;文件不存在的时候会创建后写入内容
# wt
f = open('34w.txt', mode='wt', encoding='utf8')
print(f"f.readable(): {f.readable()}")
f.write('bob 真帅呀\n') # '\n'是换行符
f.write('bob,bob, you drop, I drop.')
f.write('nick 帅的我五体投地')
f.flush() # 立刻将文件内容从内存刷到硬盘
f.close()
# wb
f = open('34a.txt', mode='wb')
f.write('nick 帅的我五体投地'.encode('unicode_escape')) # 编码成bytes类型
print(
f"type('nick 帅的我五体投地'.encode('unicode_escape')): {type('nick 帅的我五体投地'.encode('unicode_escape'))}")
f.close()
3 文件打开模式之a模式
a:可以追加。文件存在,则在文件的末端写入内容;文件不存在的时候会创建文件后写入内容。
# at
f = open('')
f = open('34a.txt', mode='at', encoding='utf8')
print(f"f.readable(): {f.readable()}")
f.write('nick 真帅呀\n') # '\n'是换行符
f.write('nick,nick, you drop, I drop.')
f.write('nick 帅的我五体投地')
f.close()
4 文件打开读取二进制
b模式是通用的模式,因为所有的文件在硬盘中都是以二进制的形式储存的,需要注意的是:b模式写文件,一定不能加上encoding参数,因为二进制无法再编码
try:
import requests
resonse = requests.get(
'http://www.chenyoude.com/Python从入门到放弃/文件的三种打开模式-mv.jpg?x-oss-process=style/watermark')
data = response.content
f = open('mv.jpg?x-oss-process=style/watermark','wb')
f.write(data)
print('done...')
f.close()
except Exception as e:
print(e,'报错了')
f = open('32w.txt','wb')
f.write('bob '.encode('utf8'))
f.close
3.绝对路径
文件路径:文件在硬盘的地址
绝对路径:从盘符开始 E:\python12期\day09\test.py
相对路径:执行文件(当前运行的文件)的文件夹下的文件名,执行文件和打开的文件属于同一文件夹下
未来的项目尽量用相对路径
f = open('test.py', 'r',encoding='utf8')
print(f.read())
windows系统写代码,部署到Linux系统
4.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()) # 涉及操作系统,报错
5.文件的高级应用(了解)
可读可写 r+
with open('test.py','r+',endoding='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='utg8') as fw:
print(fw.readable())
print(fw.writable())
fw.seek(0.0)
print(fw.read())
综上:如果你真的有即可读又可写的需求,用两种不同的模式打开两次文件
光标的高级应用(移动光标)
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相当于当前文件所在位置;2相当于在文件末尾
fr.seek(3,0) # 0开头
print(fr.read().decode('utf8'))
fr.seek(3.1)
print(fr.read().decode('utg8'))
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.trundate(2)
移动光标(以字符为单位)
read
with open('test.py','r',encoding='utf8') as fr:
print(fr.read(3)) # 表示n个字符,不加默认读取所有 # 中文和英文都属于一个字符
6.登录注册
注册
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('登录失败')
7.文件的修改
严格来说文件没有修改一说,只有覆盖
缓存文件的原理
同时打开多个文件
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','2b')
fw.write(data)
import os
os.remove('test.py')
os.rename('test_swap.py')
with open('test.py','r', encoding='utf8') as fr,\
open('test_swap.py','w', encoding='utf8') as fw:
#再大的文件都能修改
for i in fr:
s = '2b'
i = i.replace('sb',s)
fw.write(i)
# fw.flush() # 先保存成功再继续运行
1.方法一
将硬盘存放在的该文件的内容全部加载到内存,在内存中是可以修改的,修改完毕后,再有内存覆盖到硬盘(word, bim ,nodpad++等编辑器)
import os
with open('37r.txt') as fr,/
open('37r_swap.txt','w') as fw:
data = fr.read() # 全部读入内存,如果文件很大,会很卡
data = data.replace('tank','tankSB') # 在内存中完成修改
fw.write(data) # 新文件一次性写入原文件内容
# 删除文件
os.remove('37r.txt')
# 重命名新文件名为原文件名
os.rename('37r_swap.txt','37r.txt')
print('done...')
2.方法二
将硬盘存放的该文件的内容一行一行地读入内存,修改完毕就写入新文件,最后用新文件覆盖原文件
import os
with open('37r.txt') as fr,\
open('37r_swap.txt','w') as fw:
# 循环读取文件内容,逐行修改
for line in fr:
line = line.replace('jason','jasonSB')
# 新文件写入原文件修改后的内容
fw.write(line)
os.remove('37r.txt')
os.rename('37r_swap.txt','37r.txt')
print('don...')
总结:以读的方式打开原文件,以写的方式打开一个新文件,把原文件的内容进行修改,然后写入新文件,之后利用os模块的方法,把源文件删除,重命名新文件为原文件名,达到以假乱真的目的。