文件的处理
1、什么是文件
文件就是操作系统提供给应用程序来操作硬盘的虚拟的概念
2、为什么要用文件
因为人类和计算机要永久保存数据
3、怎么用文件
采用:open()
相对路径:a.txt # 必须与当前py文件在同一级目录 #### 一般建议多用相对路径
绝对路径:D:项目路径python13期day07a.txt 本机保存的位置
"""
文件上下文:
f= open('文件路径','打开文件模式','指定支付的编码')
# f = open("a.txt") 用这个来用文件
#
# print(f.readable()) # 判断当前文件是否可读
# print(f.writable()) # 判断当前文件是否可写
以下记得添加
# # del f # 回收变量资源
# f.close() # 回收操作系统的资源
with 自动帮你回收操作系统的资源 del f 需要自己自己加上
# with open(r"my testing.py",mode = 'r',encoding= 'utf-8') as f:
# # print(f.read())
# # prinf = open("E:PycharmProjectsstudymy testing.py")
# # print(f.readable())
# # print(f.writable())
# # print(f)t(f.readline())
# print(f.readlines())
# r:防止转义 防止出现不必要的信息 影响运行
举例如下
# with open(r'D:项目路径python13期day07a.txt')as f:
# print(f.read()) # 读取文件
打开文件的三种模式:
r :
1、只读
2、如果文件不存在,会报错
w:(慎用)
1、只写
2、如果文件不存在,则新建一个文件写入数据
3、如果文件内存在数据,会将数据清空,重新写入
a:
1、追加写
2、如果文件内存在数据,会在已有数据的后面追加数据
3、如果文件不存在,则新建一个文件写入数据
r:
with open(r"my testing.py",mode = 'r',encoding= 'utf-8') as f:
print(f.read())
print(f.readline())
print(f.readlines())
w
with open(r'my testi.py',mode = 'w',encoding = "utf-8") as f:
f.write('meihao shijie 世界之大')
f.writelines(['meihaoshijie
women de guojia'])文本模式
a
with open(r'my testi.py', mode='a', encoding="utf-8") as f:
f.write('zhege shiie 非常的美好 这个是字符串')
控制文件读写内容的处理模式
tb模式不能单独使用,必须与r/w/a之一结合使用
t 默认的是:文本模式
1.读写文件都是以字符串为单位的;
2.只能针对文本文件;
3.必须指定encoding参数。
b:二进制模式:
1.读写文件都是以bytes/二进制为单位的;
2.针对所有文件;
3.一定不能指定encoding参数。
b
with open(r'E:PycharmProjectsstudymy testing.py',mode ='rb') as f:
print(f.read())
with open(r'E:PycharmProjectsstudy.idea11.jpg', mode='rb') as rf,
open(r'ling.png', mode='wb') as wf:
ling = rf.read()
wf.write(ling)
文件处理的内置方法:
读:
f.read() #读文本:一次性独处所有的数据;
f.readline()# 一次只读一行
f.readlines()# 将数据全部读入内存,以换行符分隔,存入列表。
写
f.write()#写文件
f.writeable #是否可写
f.writelines()#for + f.write()
# inp_name = input('请输入你的名字:').strip()
# inp_pwd = input('请输入你的密码:').strip()
# with open(r'aaa.txt','r',encoding = 'utf-8') as f:
# for line in f:
# u,p = line.strip('
').split(' ') ###解压赋值
# if inp_name == u and inp_pwd == p:
# print('登录成功')
# else:
# print('账号名或者密码错误')
‘+’的模型
1、其他的文件模式
r+
w+
a+
ps:都说可读可写,而且带着原来的特性
一般是不用的
with open(r'aaa.txt','r+',encoding = 'utf-8') as f:
print(f.read())
f.write('在那个地方')
>>>>>>>
我们都会阿豪都爆破包租婆
在那个地方在那个地方
光标的移动
f.seek(offset,whence)
offset: 相对偏移度 (光标移动的位数)针对的是字节
whence:指定光标位置从何开始
0:从文件开头 t,b都是可以的
1:从当前位置 b是可以的
2:从文件末尾 b是可以的
1,2 也可以使用,但是光标不能移动 ### 相对偏移度始终为“0”
f.read()
读出文件所有内容
文件过大,会造成内存溢出
f.read('int类型的参数')
ps:
rt:针对的就是字符
rb:针对的是字节
utf-8:
中文是3个bytes
英文是1个bytes
gbk:
中文的是2个bytes 英文的半角是1个bytes 全角的是2个bytes
aaa.txt :我们都会阿豪都爆破包租婆
t
with open(r'aaa.txt','rt',encoding = 'utf-8') as f:
f.seek(3,0)
print(f.tell()) #查询当前的指针位置
print(f.read(2))
>>>>>>>
3
们都
###1,2 也可以使用,但是光标不能移动 ### 相对偏移度始终为“0”####
with open(r'aaa.txt','rt', encoding = 'utf-8') as f:
f.seek(-3, 2) #报错 光标不能移动
print(f.tell())
print(f.read(2))
>>>>>>>
Traceback (most recent call last):报错
File "E:/PycharmProjects/study/11.8.py", line 72, in <module>
f.seek(-3, 2)
io.UnsupportedOperation: can't do nonzero end-relative seeks
不报错的操作
with open(r'aaa.txt','rt', encoding = 'utf-8') as f:
f.seek(0, 2) ###相对的便宜度为“0”
print(f.tell())
print(f.read(2))
>>>>>>>>
我们
6
检测文件是否发生变化
1、通过f.seek(0,2),将光标移动到文件末尾
2、通过while循环,让文件保持打开状态
1、通过f.readline(),获取当前光标所在行的内容
2、通过if判断,是否获取到数据,获取到数据,说明,文件被改动
3、print
获取文件的实时监控
import time ###定义的函数
res = time.strftime('%Y-%m-%d %H:%M:%S')
with open(r'aaa.txt','a',encoding = 'utf-8') as f:
f.write(f'{res} 马上就要学函数了,加油
')
下面是实时监控的编程
with open(r'aaa.txt','r',encoding = 'utf=8') as f:
f.seek(0,2)
while True:
res = f.readline()
if res:
print(f'录入记录:{res}')
文件的修改
一种方法
with open(r'name.txt','r',encoding = 'utf-8') as f:
data = f.read()
#print(data)
with open(r'name.txt','w',encoding = 'utf-8') as f:
res = data.replace('tank','DSB')
print(f.write(res))
>>>>>>>
sean 是DSB, Sean是非常大的DSB,Sean和他们的同事都是非常大的DSB!
另外一种方法 这种方法是新建一个文本替代旧的文本,来操作 优先考虑这种
import os
with open(r'aaa.txt','r',encoding = 'utf-8') as rf, open(r'b.txt','w',encoding = 'utf-8') as wf:
data = rf.read()
res = data.replace('关键','好好')
wf.write(res)
os.remove(r'aaa.txt')
os.rename('aaa.txt','b.txt')
4、文件修改:
1、将数据一次性全部读入内存,在内存修改该数据,
写入原文件
优点:
从始至终只有一个文件
缺点:
如果文件过大,会造成内存溢出
2、使用两个文件,将原文件的数据一行行读到内存,修改之后写入新文件,
通过os模块,将原文件删除,将新文件名称改查原文件
优点:
从始至终,内存中只有一行数据
对内存的压力小
缺点:
通过两个文件来实现的
文本:我们是虚构好过航空你看过
截断
with open(r'aaa.txt','r+',encoding = 'utf-8') as f:
f.truncate(6) # 这个操作截断的功能
print(f.read())
# f.seek(-3,2)
# print(f.tell())
>>>>>>
我们
f.flush() # 将内存中数据刷到硬盘