文件操作基本流程
计算机系统分为:计算机硬件,操作系统,应用程序三部分。
内存 存不长久
硬盘 数据的持久化
文件操作 —— 数据持久化的一种
全栈开发:框架类
操作文件的流程:
#1. 打开文件,得到文件句柄并赋值给一个变量 #2. 通过句柄对文件进行操作 #3. 关闭文件
coding:文件操作
习惯叫 f file f_obj f_handler fh
#1. 打开文件,得到文件句柄并赋值给一个变量 f=open('a.txt','r',encoding='utf-8') #默认打开模式就为r #2. 通过句柄对文件进行操作 data=f.read() #3. 关闭文件 f.close()
f=open('a.txt','r')分析
#1、由应用程序向操作系统发起系统调用open(...) #2、操作系统打开该文件,并返回一个文件句柄给应用程序 #3、应用程序将文件句柄赋值给变量f
文件路径:相对路径、绝对路径
#找到文件详解:文件与py的执行文件在相同路径下,直接用文件的名字就可以打开文件 # 文件与py的执行文件不在相同路径下,用绝对路径找到文件 #文件的路径,需要用取消转译的方式来表示:1.\\ 2.r'' #如果以写文件的方式打开一个文件,那么不存在的文件会被创建,存在的文件之前的内容会被清空 # '\n' 文件的换行 # f = open(r'C:\\Users\\Administrator\\Desktop\\s8_tmp.txt','w',encoding='utf-8') # \\ f = open(r'C:\Users\Administrator\Desktop\s8_tmp.txt','w',encoding='utf-8') #文件路径、操作模式、编码 # r'' f.write('哈哈哈') f.close()
关闭文件的注意事项
文件编码
f = open('歌词','w',encoding='utf-8') #f:文件操作符 文件句柄 文件操作对象 f.write('7018201890') f.close() #open打开文件是依赖了操作系统的提供的途径 #操作系统有自己的编码,open在打开文件的时候默认使用操作系统的编码 #win7\8--->gbk mac/linux---->utf-8
#这就用到了上节课讲的字符编码的知识:若要保证不乱码,文件以什么方式存的,就要以什么方式打开。 f=open('a.txt','r',encoding='utf-8')
文件的打开模式
文件句柄 = open('文件路径', '模式')
打开文件
#打开文件 # f = open('歌词','r',encoding='utf-8') f = open('歌词',encoding='utf-8')
模式
#1. 打开文件的模式有(默认为文本模式): r ,只读模式【默认模式,文件必须存在,不存在则抛出异常】 w,只写模式【不可读;不存在则创建;存在则清空内容】 a, 之追加写模式【不可读;不存在则创建;存在则只追加内容】 #2. 对于非文本文件,我们只能使用b模式,"b"表示以字节的方式操作(而所有文件也都是以字节的形式存储的,使用这种模式无需考虑文本文件的字符编码、图片文件的jgp格式、视频文件的avi格式) rb wb ab 注:以b方式打开时,读取到的内容是字节类型,写入时也需要提供字节类型,不能指定编码
f.writable() #判断文件是否可写
f = open('1.歌词.txt','w',encoding="utf-8") print(f.writable()) # #判断文件是否可写 f.close() # True
f.readable() #判断文件是否可读
f = open('1.歌词.txt','w',encoding="utf-8") print(f.readable()) # #判断文件是否可写 f.close() # False
读文件
1.read方法会一次性的读出文件中的所有内容
#1.读文件的第一种方式:read方法,用read方法会一次性的读出文件中的所有内容 f = open('1.歌词.txt',encoding='utf-8') content = f.read() print('read : ',content) # f.close()
输出结果
read : 111
222
aaa
bbb
哇哈哈
QQ星
2.读一部分内容:read(n),指定读n个单位
#2.读一部分内容:read(n),指定读n个单位 f = open('1.歌词.txt',encoding='utf-8') print(f.read(2)) # 11 f.close()
3.按照行读,每次执行readline就会往下读一行
#3.读文件的第三种方式:按照行读,每次执行readline就会往下读一行 f = open('1.歌词.txt',encoding='utf-8') content = f.readline() print('readline : ',content.strip()) #strip去掉空格、制表符、换行符 content2 = f.readline() print(content2.strip()) f.close()
输出结果
readline : 111 222
4.readlines,返回一个列表,将文件中的每一行作为列表中的每一项返回一个列表
#4.读文件的第四种方式:readlines,返回一个列表,将文件中的每一行作为列表中的每一项返回一个列表 f = open('1.歌词.txt',encoding='utf-8') content = f.readlines() print('readlines : ',content) # readlines : ['111\n', '222\n', 'aaa\n', 'bbb\n', '哇哈哈\n', 'QQ星'] f.close()
5.读:最常用for循环
#5.读:最常用for循环 f = open('1.歌词.txt',encoding='utf-8') for l in f: print(l.strip()) f.close()
输出结果
111
222
aaa
bbb
哇哈哈
QQ星
列子:
1.歌词.txt
1.读文件并整理成需要的数据类型
f = open('1.歌词.txt',encoding='utf-8') #读文件并整理成需要的数据类型 goods_list = [] for line in f: if line.strip(): goods_dic = {'name':None,'price':None} line = line.strip() goods_lst = line.split() print(goods_lst) goods_dic['name'] = goods_lst[0] goods_dic['price'] = goods_lst[1] goods_list.append(goods_dic) print(goods_list) f.close()
输出结果:
2.只显示文件中有内容的行
f = open('1.歌词.txt',encoding='utf-8') #只显示文件中有内容的行 goods_list = [] for line in f: if line.strip(): print(line.strip()) f.close()
输出结果:
文件内的光标移动
一: read(3):
1. 文件打开方式为文本模式时,代表读取3个字符
2. 文件打开方式为b模式时,代表读取3个字节
二: 其余的文件内光标移动都是以字节为单位如seek,tell,truncate
注意:
1. seek有三种移动方式0,1,2,其中1和2必须在b模式下进行,但无论哪种模式,都是以bytes为单位移动的
2. truncate是截断文件,所以文件的打开方式必须可写,但是不能用w或w+等方式打开,因为那样直接清空文件了,所以truncate要在r+或a或a+等模式下测试效果
#tell: 告诉你当前光标所在的位置
#seek 光标移动到第几个字节的位置 # f.seek(0) 移动到最开始 # f.seek(0,2) 移动到最末尾
#truncate: 保留n个字节 ps:
从文件开始的位置只保留指定字节的内容
f = open('1.歌词.txt','r+',encoding='utf-8') f.truncate(3) #从文件开始的位置只保留指定字节的内容 content2 = f.readline() print(content2.strip()) # aab f.close()
查看1.txt文件,已被修改,只有aab3个字节了。
文件的修改
文件的数据是存放于硬盘上的,因而只存在覆盖、不存在修改这么一说,我们平时看到的修改文件,都是模拟出来的效果,具体的说有两种实现方式:
方式一:将硬盘存放的该文件的内容全部加载到内存,在内存中是可以修改的,修改完毕后,再由内存覆盖到硬盘(word,vim,nodpad++等编辑器)
import os with open('a.txt') as read_f,open('.a.txt.swap','w') as write_f: data=read_f.read() #全部读入内存,如果文件很大,会很卡 data=data.replace('alex','SB') #在内存中完成修改 write_f.write(data) #一次性写入新文件 os.remove('a.txt') os.rename('.a.txt.swap','a.txt')
方式二:将硬盘存放的该文件的内容一行一行地读入内存,修改完毕就写入新文件,最后用新文件覆盖源文件
import os with open('a.txt') as read_f,open('.a.txt.swap','w') as write_f: for line in read_f: line=line.replace('alex','SB') write_f.write(line) os.remove('a.txt') os.rename('.a.txt.swap','a.txt')