一套完整的计算机系统
什么是文件
为什么操作文件
文件操作的三步骤
1.打开文件: 硬盘空间被操作系统持有,文件对象被应用程序持有得到文件句柄并赋值给一个变量
2.通过句柄对文件进行操作
3.释放文件:释放操作系统对硬盘空间的持有
文件操作的语法
打开文件
# 自定义变量名f = open(r'文件路径',mode='读写模式',encoding='指定编码')
# f是文件对象,句柄
# r用来取消转义
# 文件路径分为
相对路径:必须有一个参照物 通常是相对于执行文件所在的文件夹
绝对路径:不需要有任何的参照物,目录下的绝对位置,直接到达目标位置,通常是从盘符开始的路径
# 可不写mode直接写读写模式,读写模式不指定默认使用 'rt' 读文本模式
# encoding编码参数只在mode为文本模式的情况下才加
不写默认操作系统会用自己的默认编码去打开文件,在windows下是gbk,在linux下是utf-8
若要保证不乱码,文件以什么编码方式存的,就要以什么编码方式打开
操作文件
读模式
# f.read(参数) 参数为读取指定字符数,不写参数是将文件所有内容一次性读完,当文件过大的情况下该方法可能会导致内存溢出
# f.readline() 一次读取一行(文件的换行标识就是结束本次读取的依据)
# f.readlines() # 将一行行的内容都读到内存,按换行标识作为读取一行的依据,存放为列表
#
:换行符 现在做了优化 可以只写
或者
# f.readable():判断是否可读
写模式
# f.writeable() 是否可写
# f.write(参数) 将内容写入文件,参数是要写入内容
# f.writeline(参数) 向文件写入一行内容,参数是要写入内容
# f.writelines(参数) 向文件写入多行内容,参数要为容器类型的要写入内容
# f.truncate(参数) 截断方法 参数是要保留内容的字节的长度且整型,不保留的会全部删除
# f.flush() # 告诉向操作系统将内存中写入或修改的数据刷新到硬盘
关闭文件
# f.close() # 告诉操作系统将内存中写入的数据刷新到硬盘并关闭打开的文件释放硬盘空间
也可以删除句柄用于 del 变量名f
光标(也称为游标,指针)
# f.seek(offset,whence)
offset:相对偏移量是光标移动的位数
# -- offset为整数就是往后偏移多少个字节,负数就是往前偏移多少个字节
whence:
0:参照文件将游标置为开头 t和b都可以使用
1:参照光标所在的当前位置 只能在b模式下用
2:参照文件的末尾 只能在b模式下使用
# -- whence:0代表将游标置为开头,1代表从当前位置,2代表将游标置为末尾
f.tall()查看光标移动了多少个字节
with...open语法
# with open(r'文件路径',mode='读写模式',encoding='指定编码') as 变量名:
# 文件操作的具体代码
# 优化整合了文件资源的打开与释放,不用再写close()关闭文件
# -- 在with的缩进内可以操作文件对象,一旦取消缩进,文件自动关闭,资源就被释放
# as起别名,变量名为持有文件资源的变量
文件的操作模式
主模式:r | w | a | x
-- 主模式只能选取一个,规定着主要的操作方式
从模式:t | b | +
-- 从模式也必须出现,但个数不一定是一个,为主模式额外添加功能
r: 读,必须有文件
w: 清空写,文件可有可无
a: 追加写,文件可有可无
x:创建写,文件必须无,一般不使用
t:从模式不写默认为t,按字符操作
b:按字节操作
+:可读可写
# rt: 文件必须提前存在,不存在报错,文件操作采用字符形式 - 简写为 r
# wt: 文件可以存在,也可以不存在,存在则清空后写入,不存在新建后写入,文件操作采用字符形式 - 简写为 w
# at: 文件可以存在,也可以不存在,存在在之前内容的末尾追加写入,不存在新建后写入,文件操作采用字符形式 - 简写为 a
# rb: 文件必须提前存在,不存在报错,文件操作采用字节形式
# wb: 文件可以存在,也可以不存在,存在则清空后写入,不存在新建后写入,文件操作采用字节形式
# ab: 文件可以存在,也可以不存在,存在在之前内容的末尾追加写入,不存在新建后写入,文件操作采用字节形式
# r+t:文件必须存在的可读可写,默认从头开始替换写,按字符操作
# w+t:文件存在清空不存在创建的可读可写,按字符操作
# a+t:文件存在追加不存在创建的可读可写,按字符操作
# r+b:文件必须存在的可读可写,默认从头开始替换写,按字节操作
# w+b:文件存在清空不存在创建的可读可写,按字节操作
# a+b:文件存在追加不存在创建的可读可写,按字节操作
文件的操作编码问题
t模式下:原文件采用什么编码,你就选取什么编码操作,如果不选取,默认跟操作系统保持一致
-- t模式下一定要指定编码
b模式下:硬盘的数据就是二进制,且能根据内容识别出编码,写入时的数据也是通过某种编码提前处理好的,所有在操作时,没有必要再去规定编码
python2中的file与open
#首先在python3中操作文件只有一种选择,那就是open()
#而在python2中则有两种方式:file()与open()
两者都能够打开文件,对文件进行操作,也具有相似的用法和参数,但是,这两种文件打开方式有本质的区别,file为文件类,用file()来打开文件,相当于这是在构造文件类,
而用open()打开文件,是用python的内建函数来操作,我们一般使用open()打开文件进行操作,而用file当做一个类型,比如type(f) is file
文件修改
第一种
# 将文件内容先读取到内存在内存中完成修改,然后重新覆盖原文件
优点:硬盘上始终只有一个文件
缺点:内存很有可能会溢出 当文件内容过大的情况下
# with open(r'test02.txt','r',encoding='utf-8') as f:
# data = f.read()
# print(data)
# print(type(data))
#
# with open(r'test02.txt','w',encoding='utf-8') as f:
# res = data.replace('egon','jason')
# print(data)
# f.write(res)
第二种
# 重新创建一个新的文件,将老文件的内容一行行读入内存完成修改直接写到新的文件中,利用os模块将原文件删除,将新文件的名字改为来文件的名字
优点:内存中始终只有文件的一行内容 不占用内存
缺点:硬盘上在某一时刻会出现两个文件
# import os
#
# with open(r'test02.txt','r',encoding='utf-8') as read_f,
# open(r'test02.swap','a',encoding='utf-8') as write_f:
# for line in read_f:
# new_line = line.replace('jason','egon')
# write_f.write(new_line)
# os.remove('test02.txt')
# os.rename('test02.swap','test02.txt')