一、基本的文件操作
1.什么是文件?
文件是操作系统提供的虚拟的单位,有了文件我们可以读取数据,没有文件的话应该去硬盘上扣动机械手臂后寻找数据。
文件的核心是:读和写
2.为什么要有文件?
内存无法永久保存数据,想要永久保存数据都需要把文件保存到硬盘中,而操作文件就可以实现对硬件的操作。
3.如何使用文件?
-
打开文件()
-
读写数据
-
保存
-
关闭文件
使用Python写一个小程序控制文件 #print(fr.read()) #read一次性读取所有数据 #fr.close() #不仅删除了变量名 f, 并且也关闭了文件,这个时候文件对于操作系统来讲是关闭状态的
-
打开文件的那一瞬间是在操作硬盘和内存
-
python3能操控硬盘和内存吗?一定不能,因为他是应用程序。
-
你看到的Python3打开文件并操控,都是基于操作系统的。
-
然后你只是使用了 del f ,只是在删除f这个变量名的内存占用。但是我们从来都没有告诉操作系统关闭文件
-
所以我们必须使用f.close()关闭文件
二、绝对路径和相对路径
绝对路径:从根目录开始,一直到需要的文件路径
相对路径:从当前文件夹开始,到需要的文件路径,只需要输入文件路径,要打开的文件和运行的py文件必须得在一个文件夹下
三、文件的三种打开方式
文件操作的基础模式有三种(默认的操作模式为r模式)
# mode='r', r模式为read,只读模式,只能读不能写,文件不存在时报错。
# mode='w', w模式为write,只写,清空文件在写入
# mode='a', a模式为append,追加,在后面追加写入文件
文件读写内容的格式有两种(默认的读写内容的模式为b模式):
t模式为text
b模式为bytes
需要注意的是:t、b这两种模式均不能单独使用,都需要与r/w/a之一连用。
#mode='rb', #打开的bytes类型,二进制#0101000011
fr=open(r'D:\Python视频\Python9期视频\day 09\test.txt',mode='rb') #默认r=rt
print(fr)
bytes_data=fr.read()
print(bytes_data)
r , r告诉接下来的字符串,里面所有的特殊字符都变得无意义
b表示,写的字符串为二进制,在打印时候不需要使用终端的编码处理,直接打印原生的二进制即可。
r/w/a能单独使用。
四、with 管理上下文
之前使用open()方法操作文件,但是open打开文件文件后我们还需要手动释放文件对操作系统的占用。
Python提供的上下文管理工具更方便-------with open(),不仅提供自动释放操作系统占用的方法,并且with open可以使用逗号分隔,一次性打开多个文件,实现文件的快速拷贝。
with open(文件路径,打开模式(rt/wt/at/wb/ab),编码格式) as 变量名:
变量名.read/wite
with open('test.txt','r',encoding='utf8') as fr:
data=fr.read()
print(data)
五、文件高级应用.py
- r+t 可读、可写
- w+t 可写、可读
- a+t 可追加、可读
r只读/w只写/a追加,可读可写(不推荐使用),r+,w+,a+
# 指针(不要使用指针)
with open('test.txt','rt+',encoding='utf8') as fa:
# 3个字节,
# fa.readline()
fa.seek(5, 0) # 字节算的
# fa.seek(3, 1)
print(fa.tell()) # 告诉你光标当前的位置
print(fa.read(3)) # 光标后的字符个数,一个中文1个字符,3个字节;一个英文一个字符,一个字节
fa.truncate(3) # 如果它有参数,则光标会跳到指定字节数后,然后把后面的文件全部清空
fa.flush()
nick 中文 245234234
中文45234234 # 没有seek(3,0) # 0表示文件头
nic中文34234 # 有seek(3,0),seek(3,0)
nick 245234234中文 # 有seek(0,2) # 2表示文件末尾
nick 2a5234234 # 有seek(3,1),seek(3,1) # 1表示当前位置,但是必须得以二进制的形式打开
'''
# 文件的写入没有插入一说,只有覆盖
文件内指针移动:
假设我们需要在文件内容中间的某一行增加内容,如果使用基础的r/w/a模式实现是非常困难的,因此我们需要对文件内的指针进行移动。
硬盘上从来没有修改一说,硬盘上只有覆盖,即新内容覆盖新内容
-
seek(offset,whence): offset代表文件指针的偏移量,单位是字节
-
ell(): 每次统计都是从文件开头到当前指针所在位置
-
read(n): 只有在模式下的read(n),n代表的是字符个数,除此之外,其他但凡涉及文件指针的都是字节个数
-
runcate(n): truncate(n)是截断文件,所以文件的打开方式必须可写,但是不能用w或w+等方式打开,因为那样直接清空文件了,所以truncate()要在r+或a或a+等模式下测试效果。它的参照物永远是文件头。并且truncate()不加参数,相当于清空文件。
六、修改文件内容的两种方式:
文件的数据是存放于硬盘上的,因而只存在覆盖、不存在修改这么一说,我们平时看到的修改文件,都是模拟出来的效果,具体的说有两种实现方式
方式一:一次性读所有
将硬盘存放的该文件的内容全部加载到内存,在内存中是可以修改的,修改完毕后,再由内存覆盖到硬盘(word,vim,nodpad++等编辑器)
方式二:逐行读取
将硬盘存放的该文件的内容一行一行地读入内存,修改完毕就写入新文件,最后用新文件覆盖源文件。
文件的拷贝
文件不能插入,但是有需求要修改文件,插入。
总结:
-
qq想修改这个程序,微信也想修改这个程序,两者都已经读取文件成功,都拿到了‘tank handsome'
-
qq想修改’tank handsome'中的‘h’为‘a’,微信想把‘h'修改为'b’,这两个修改一定有先后顺序,假如qq先修改了,那么‘h’已经变成了‘a’,微信就找不到'h'了,报错。
-
qq想修改’tank handsome'中的‘h’为‘a’,微信想把‘h'修改为'b’,所以给qq一份拷贝文件,给微信一份拷贝文件,让他们各自修改,修改成功后,删除原文件,修改替换后的文件名为原文件。
减少了内存的占用
w在清空文件,而不是wite清空文件
文件只需要记住
-
with open(filename,mode,encoding) as file: file+操作
-
rt/rb/wt/at
-
文件的复制