作者:Json | 来源:互联网 | 2023-02-03 18:22
文件操作基本流程计算机系统分为:计算机硬件,操作系统,应用程序三部分。内存存不长久硬盘数据的持久化文件操作——数据持久化的一种全栈开发:框架类操作文件的流程:#1.打开文件
文件操作基本流程
计算机系统分为:计算机硬件,操作系统,应用程序三部分。
内存 存不长久
硬盘 数据的持久化
文件操作 —— 数据持久化的一种
全栈开发:框架类
操作文件的流程:
#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()
关闭文件的注意事项
打开一个文件包含两部分资源:操作系统级打开的文件+应用程序的变量。在操作完毕一个文件时,必须把与该文件的这两部分资源一个不落地回收,回收方法为:
1、f.close() #回收操作系统级打开的文件
2、del f #回收应用程序级的变量
其中del f一定要发生在f.close()之后,否则就会导致操作系统打开的文件还没有关闭,白白占用资源,
而python自动的垃圾回收机制决定了我们无需考虑del f,这就要求我们,在操作完毕文件后,一定要记住f.close()
虽然我这么说,但是很多同学还是会很不要脸地忘记f.close(),对于这些不长脑子的同学,我们推荐傻瓜式操作方式:使用with关键字来帮我们管理上下文
with open('a.txt','w') as f:
pass
with open('a.txt','r') as read_f,open('b.txt','w') as write_f:
data=read_f.read()
write_f.write(data)
注意
注意
文件编码
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方式打开时,读取到的内容是字节类型,写入时也需要提供字节类型,不能指定编码
#"+" 表示可以同时读写某个文件
r+, 读写【可读,可写】
w+,写读【可读,可写】
a+, 写读【可读,可写】
x, 只写模式【不可读;不存在则创建,存在则报错】
x+ ,写读【可读,可写】
xb
了解
了解1
由于历史的原因,换行符在不同的系统中有不同模式,比如在 unix中是一个\n,而在windows中是‘\r\n’,用U模式打开文件,就是支持所有的换行模式,也就说‘\r’ '\n' '\r\n'都可表示换行
t是windows平台特有的所谓text mode(文本模式),区别在于会自动识别windows平台的换行符。
了解2
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()
输出结果
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()
输出结果
列子:
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()
输出结果:
['apple', '10', '3']
['tesla', '1000000', '1']
['mac', '3000', '2']
['lenovo', '30000', '3']
['chicken', '10', '3']
['phone', '5000', '1']
['computer', '6000', '5']
['computer', '6000', '5']
['computer', '6000', '5']
['computer', '6000', '5']
['computer', '6000', '5']
[{'name': 'apple', 'price': '10'}, {'name': 'tesla', 'price': '1000000'}, {'name': 'mac', 'price': '3000'}, {'name': 'lenovo', 'price': '30000'}, {'name': 'chicken', 'price': '10'}, {'name': 'phone', 'price': '5000'}, {'name': 'computer', 'price': '6000'}, {'name': 'computer', 'price': '6000'}, {'name': 'computer', 'price': '6000'}, {'name': 'computer', 'price': '6000'}, {'name': 'computer', 'price': '6000'}]
结果:
2.只显示文件中有内容的行
f = open('1.歌词.txt',encoding='utf-8') #只显示文件中有内容的行
goods_list = []
for line in f:
if line.strip():
print(line.strip())
f.close()
输出结果:
apple 10 3
tesla 1000000 1
mac 3000 2
lenovo 30000 3
chicken 10 3
phone 5000 1
computer 6000 5
computer 6000 5
computer 6000 5
computer 6000 5
computer 6000 5
结果:
文件内的光标移动
一: read(3):
1. 文件打开方式为文本模式时,代表读取3个字符
2. 文件打开方式为b模式时,代表读取3个字节
二: 其余的文件内光标移动都是以字节为单位如seek,tell,truncate
注意:
1. seek有三种移动方式0,1,2,其中1和2必须在b模式下进行,但无论哪种模式,都是以bytes为单位移动的
1.offset -- 这是在文件中,读/写指针的位置。
2.whence -- 这是可选的,默认为0,这意味着绝对的文件定位,其它的值是1,这意味着寻求相对于当前位置,2表示相对于文件的末尾。
seek参数详解
2. truncate是截断文件,所以文件的打开方式必须可写,但是不能用w或w+等方式打开,因为那样直接清空文件了,所以truncate要在r+或a或a+等模式下测试效果
#tell: 告诉你当前光标所在的位置
f = open('1.歌词.txt','r+',encoding='utf-8')
content = f.readline()
print(content.strip()) # aabbccdd\n (第一行)
#tell告诉你当前光标所在的位置
print(f.tell()) # 10
f.close()
# aabbccdd\n (第一行)
# 01234567 '\n'==2个字节 ---》9
# (光标在此处)tesla 1000000 1 (光标第二行是前面)
tell
#seek 光标移动到第几个字节的位置
# f.seek(0) 移动到最开始
# f.seek(0,2) 移动到最末尾
#truncate: 保留n个字节
ps:
aabbccdd
tesla 1000000 1
mac 3000 2
lenovo 30000 3
chicken 10 3
phone 5000 1
computer 6000 5
computer 6000 5
computer 6000 5
computer 6000 5
computer 6000 5
1.txt
从文件开始的位置只保留指定字节的内容
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')