介绍:
计算机系统分为:计算机硬件,操作系统,应用程序三部分。
我们用python或其他语言编写的应用程序若想要把数据永久保存下来,必须要保存于硬盘中,这就涉及到应用程序要操作硬件,众所周知,应用程序是无法直接操作硬件的,这就用到了操作系统。操作系统把复杂的硬件操作封装成简单的接口给用户/应用程序使用,其中文件就是操作系统提供给应用程序来操作硬盘虚拟概念,用户或应用程序通过操作文件,可以将自己的数据永久保存下来。
有了文件的概念,我们无需再去考虑操作硬盘的细节,只需要关注操作文件的流程:
#1. 打开文件,得到文件句柄并赋值给一个变量
#2. 通过句柄对文件进行操作
#3. 关闭文件
#1. 打开文件,得到文件句柄并赋值给一个变量 f=open('a.txt','r',encoding='utf-8') #默认打开模式就为r #2. 通过句柄对文件进行操作 data=f.read() #3. 关闭文件 f.close()
了解文件操作模式:
1、读模式
- f.read()
- f.readable()#这个文件是否可读,返回布尔值;
- f.readline(“读模式”)#读取第一行;f.readlines(“读模式”)#读取所有内容 以字符串方式存储在列表内;
2、写模式
- f.write('写模式') #注意写之前会清空原文本文件,然后进行写入! 若没有文件则会新创建一个文件进行写入;
- f.write("写模式1 写模式2 写模式3 写模式4 ") #换行写入;
- f.writelines(["写模式1 写模式2 写模式3 写模式4 "]) #该模式要传入的数据类型必须是列表;
- f.writable() #这个文件是否可写,返回布尔值;
f = open('小重山','w',encoding='utf-8') #第一个参数是文件位置,第二个参数是写模式,第三个参数是定义编码 data = f.write('写模式') print(data) f.close() #注意 写之前会清空原文本文件,然后进行写入! 若没有文件则会新创建一个文件进行写入 f = open('name','w',encoding='utf-8') #第一个参数是文件位置,第二个参数是写模式,第三个参数是定义编码 data = f.write("写模式1 写模式2 写模式3 写模式4 ") print(data) f.close() 写模式1 写模式2 写模式3 写模式4 f.writelines(["写模式1 写模式2 写模式3 写模式4 "])#该模式要传入的数据类型必须是列表 f = open('小重山','a',encoding='utf-8') # a 代表 append 追加 不会清空原文件 data = f.write('写模式') print(data) f.close()
3、r+ , w+ , a+模式
with:
同时管理多个文件对象
with open('log1','r') as f_read, open('log2','w') as f_write: for lien in f_read: f_write.write(lien)
操作方法总结:
#1. 打开文件的模式有(默认为文本模式): r ,只读模式【默认模式,文件必须存在,不存在则抛出异常】 w,只写模式【不可读;不存在则创建;存在则清空内容】 a, 之追加写模式【不可读;不存在则创建;存在则只追加内容】 #2. 对于非文本文件,我们只能使用b模式,"b"表示以字节的方式操作(而所有文件也都是以字节的形式存储的,使用这种模式无需考虑文本文件的字符编码、图片文件的jgp格式、视频文件的avi格式) rb wb ab 注:以b方式打开时,读取到的内容是字节类型,写入时也需要提供字节类型,不能指定编码 #3. 了解部分 "+" 表示可以同时读写某个文件 r+, 读写【可读,可写】 w+,写读【可读,可写】 a+, 写读【可读,可写】 x, 只写模式【不可读;不存在则创建,存在则报错】 x+ ,写读【可读,可写】 xb
f = open("name","rb") date = f.read() #字符串------------>>>encode----------->>>bytes #bytes------------>>>encode----------->>>字符串 print(date) print(date.decode("utf-8"))
4、文件修改过程实质上就是覆盖的过程
#1、将要修改的文件从硬盘读取到内存中
#2、在内存中修改文件
#3、把修改后的文件覆盖到硬盘中
#普通版 f = open("name","r",encoding="utf-8") date = f.readlines()#读取所有内容 以字符串方式存储在列表内 f.close() t = open("小重山","w",encoding="utf-8") t.write(date[1]) #通过切片的方式将列表内容取出并写到文件中 t.close() #升级版 with open("name","r",encoding="utf-8") as f, open("小重山","w",encoding="utf-8") as t: #(as f)等价于(f=),斜杠回车换行 date = f.readlines() f.close() t = open("小重山", "w", encoding="utf-8") t.write(date[0]) t.close()
5、文件的其他操作
- 文件内光标的移动:
注意:read(3)代表读取3个字符,其余的文件光标移动都是以字节为单位如seek,tell,truncate
# f = open("name","r+",encoding="utf-8",newline="")#去掉回车键的处理显示原值 ;
# deta = f.read(3)#以字符方式读取
# print(f.tell())
# f.seek(12)#以字节方式调整光标的位置,(在windows系统中(/r/n)表示回车换行)
# print(f.tell())#以字节方式读取光标的位置
# print(f.readlines())
# print(f.truncate(3))#文件截取实际就是在写文件必须用(r+,a+)
# f.flush() #把缓存里的数据更新到磁盘上(防止程序崩溃数据丢失)作用于终端
seek的高级用法:
seek("光标的参数",0)#正序,默认从0开始数 seek(10,0)=seek(10)
seek("光标的参数",1) #相对位置,相对于光标上次停在的位置 seek(10,1)
seek("光标的参数",2)#倒序,从文件的最后一个字符开始数,seek(-10,2)
a = [1234,456,"dasfgf","we2","xdfcgbhjk","234567"] print(len(a)) #查看列表的长度 print(a[-1]) #提取列表中的最后一行 #需求:读取日志文件的最后一行。 f = open("name","rb")#以字节的方式读取 for i in f: #直接从文件中遍历,要一行取一行,不占内存; #print(i.decode("utf-8"))#解码 offs = -10 #定义偏移量 while True: f.seek(offs,2) #倒序,从最后一行开始数, data = f.readlines() #将光标移动到的所有字符转换成列表 if len(data) > 1: #判断列表的长度 print("文件的最后一行是: %s" %(data[-1].decode("utf-8")))#取列表的最后一行 break offs*=2 #如果最后一行没有取完则重新定义偏移量,知道len(data)>1;
f = open('小重山','r',encoding='utf-8') #第一个参数是文件位置,第二个参数是写模式,第三个参数是定义编码 number = 0 for i in f: #这里for内部将f做成一个迭代器,用一行取一行,用完清空,不占内存 number += 1 if number == 2: i = ''.join([i.strip() , 'oooo']) print(i.strip()) f.close() print(f.tell(3)) #打印光标的位置 对于英文字符就占一个,中文字符占3个; print(f.seek(3)) #调整光标位置的 f.flush() #把缓存里的数据更新到磁盘上(防止程序崩溃数据丢失) >>> f = open('hello','w') >>> f.write('alex is 35 ')11 >>> f.write('hello world')11 >>> f.flush() alex is 35 hello world #进度条效果展示 import sys,time for i in range(30): #第一种方法 sys.stdout.write('=') sys.stdout.flush() time.sleep(0.1) for i in range(30): #第二种方法 print('=',end='',flush=True) time.sleep(0.1) f.truncate()# 截取字符 f = open('小重山','a',encoding='utf-8') f.write('asfzxc') f.truncate(5)