文件操作
什么是文件?
所谓“文件”,就是在我们的电脑中,以实现某种功能、或某个软件的部分功能为目的而定义的一个单位。
为什么要有文件
内存无法永久保存数据,但凡我们想要永久保存数据都需要把文件保存到硬盘中,而操作文件就可以实现对硬件的操作。
文件的打开过程
- step1 点击需要打开的文件
- step2 操作系统接收到命令,将文件路径传送给CPU
- step3 CPU根据路径去硬盘中寻找文件,然后调取到内存中
- step4 操作系统将调取的文件显示出来,可进行读写保存等操作
python如何操作文件
现在我有一段字符串需要存储到文件中,该如何通过编程进行实现呢?
str1 = 'Bonnie is a beautiful girl'
从硬盘中读取数据
在python中有一个open(file,mode,encoding )
函数打开某个具体的文件
- file 代表文件路径
- mode 表示文件操作模式,默认为只读不写
- encoding 表示文件解码方式
open(r'D:Python编程文件编程Myself测试文件')
如果给列表增加值,我们需要给列表赋值后才能给对应的列表增加值,文件同样是如此
lis = [1,2,3]
lis.append(4)
# 打开文件
f = open(r'E:学习资料Python编程文件编程Myself38a.txt')
print(frzaf)
<_io.TextIOWrapper name='E:\学习资料\Python编程文件\编程Myself\38a.txt' mode='r' encoding='cp936'>
文件的打开方式
打开文件后,文件不仅占用了内存,还对应了操作系统打开的文件,相当于使用文件编辑器打开了一个文件。之前说过,操控文件的目的就是存和取,因此打开文件不是目的,读和写才是目的,所以我们要尝试如何读写文件。
读入模式( read模式)
f = open(r'D:Python编程文件编程Myself测试文件',mode='r',encoding='utf-8')
print(f.read())
f.close()
Bonnie is a beautiful girl
写入模式( write模式)
fw = open(r'D:Python编程文件编程Myself测试文件',mode='w',encoding='utf-8')
fw.write('hades is handsome')
fw.flush()
fw.close() # 将"Bonnie is a beautiful girl"替换成了hades is handsome
'''
最终打印结果:
hades is handsome
'''
绝对路径和相对路径
- 绝对路径就是从根目录开始,如
open(r'D:Python编程文件编程Myself测试文件')
- 相对路径就是文件都处在同一个文件夹中,如
open(r'测试文件')
with管理文件操作上下文
- 实现文件的打开
with open(r'D:Python编程文件编程Myself测试文件', 'r', encoding='utf8') as fr:
data = fr.read()
print(data)
hades is handsome
Bonnie is a beautiful girl
- 实现文件write
with open(r'D:Python编程文件编程Myself测试文件', 'w', encoding='utf8') as f:
f.write('hades is handsome')
with open(r'D:Python编程文件编程Myself测试文件', 'r', encoding='utf8') as fr:
data = fr.read()
print(data)
hades is handsome
with open(r'D:Python编程文件编程Myself测试文件', 'a', encoding='utf8') as f:
f.write('
Bonnie is a beautiful girl')
with open(r'D:Python编程文件编程Myself测试文件', 'r', encoding='utf8') as fr:
data = fr.read()
print(data)
hades is handsome
Bonnie is a beautiful girl
- 实现文件的拷贝
with open('test', 'r', encoding='utf8') as fr,
open('test1', 'w', encoding='utf8') as fw:
data = fr.read()
fw.write(data)
绝对路径和相对路径
绝对路径
在windows系统中,绝对路径是从盘符开始的,如C:\,D:
- D:Python编程文件编程Myself测试文件
相对路径
相对路径就是相对于当前文件所在的路径,就是从本层文件中找
f = open('测试文件') # 这就是相对路径
文件的三种打开方式
文件打开之r模式
r:表示read,只读模式,只能读不能写,当文件不存在时会报错
f = open(r'E:学习资料Python编程文件编程Myself38a.txt',mode='r',encoding='utf-8')
print(f.read())
f.close()
bonnie is a beautiful girl
# rt:表示用text读取文本文件
# 我们的操作系统默认编码为gbk,因此需要使用utf-8编码
f = open(r'E:学习资料Python编程文件编程Myself38a.txt',mode='rt',encoding='utf-8')
data = f.read()
print(data)
print(type(data))
f.close()
bonnie is a 漂亮的 girl
<class 'str'>
# rb:表示用二进制读取文本文件
# b模式是通用的模式,因为所有的文件在硬盘中都是以二进制的形式存储的,需要注意的是:b模式读写文件,
# 一定不能加上encoding参数,因为二进制无法再编码。
f = open(r'E:学习资料Python编程文件编程Myself38a.txt',mode='rb')
data = f.read()
print(data)
print(type(data))
f.close()
b'bonnie is a xe6xbcx82xe4xbaxaexe7x9ax84 girl'
<class 'bytes'>
f.read()读取文件时指针会跑到文件的最后面,如果再次读取,将会是空格
f = open(r'E:学习资料Python编程文件编程Myself38a.txt',mode='r',encoding='utf-8')
data1 = f.read()
print(1,data1)
data2 = f.read()
print(2,data2)
f.close()
1 bonnie is a 漂亮的 girl
2
如果文件过大,read一次性读取文件所有内容,很容易造成电脑卡死,因此我们可以使用f.readline()/f.readlines()读取文件
文件打开之w模式
w:表示write,只能写不能读,需要先清空文件再写入内容;当文件不存在时,会先创建文件后再写入
fw = open(r'E:学习资料Python编程文件编程Myself38a.txt',mode='w',encoding='utf-8')
fw.write('hades is handsome')
fw.flush()
fw.close() # 将"Bonnie is a beautiful girl"替换成了hades is handsome
'''
最终打印结果:
hades is handsome
'''
文件打开之a模式
w:表示追加,文件存在,则在文件的末端写入内容;文件不存在的时候会创建文件后写入内容。
fa = open(r'E:学习资料Python编程文件编程Myself38a.txt',mode='a',encoding='utf-8')
fa.write('hades is handsome')
fa.write('
Bonnie is a beautiful girl')
fa.flush()
fa.close()
'''
最终打印结果:
hades is handsome
Bonnie is a beautiful girl
'''
with管理文件操作上下文
之前我们使用open打开文件的时候,我们还需要进行手动释放文件对内存的 占用,所以很不方便,其实还有更好的方法打开文件,就是python中的上下文管理工具----with open().
with open(r'E:学习资料Python编程文件编程Myself38a.txt',mode='r',encoding='utf-8') as fr:
print(fr.read())
hades is handsomehades is handsome
Bonnie is a beautiful girl
with open()不仅提供自动释放内存的方法,还可以一次打开多个文件,中间使用逗号隔开,实现文件的快速拷贝。
文件的高级应用
可读/可写
- r+t:可读、可写
- w+t:可写、可读
- a+t:可追加、可读
with open('36w.txt', 'wt', encoding='utf-8') as fw:
print(fw.readable())
print(fw.writable())
False
True
with open('36w.txt', 'w+t', encoding='utf-8') as fw:
print(fw.readable())
print(fw.writable())
True
True
with open('36w.txt', 'r+t', encoding='utf-8') as fr:
print(fr.readable())
print(fr.writable())
True
True
文件内的指针移动
当文件内容中间需要增加内容时,单纯的使用w和a模式已无法实现,所以我们需要对文件内的指针进行移动
- 指针就是我们眼中的光标
硬盘上从来没有修改一说,硬盘上只有覆盖,即新内容覆盖新内容。
seek(offset,whence)
-
offset代表文件指针的偏移量,单位是字节,
-
whence代表光标的位置,0表示文件的开头,1代表当前光标位置,2表示文件末尾
with open(r'E:学习资料Python编程文件编程Myself38a.txt',mode='rt',encoding='utf-8') as fr:
data = fr.seek(8,0)
print(data)
8
tell()
每次统计都是从文件的开头到当前指针所在的位置
with open(r'E:学习资料Python编程文件编程Myself38a.txt',mode='rt',encoding='utf-8') as fr:
data = fr.seek(3,0)
print(fr.tell())
3
read(n)
只有在模式下的read(n),n代表的是字符个数,除此之外,其他但凡涉及文件指针的都是字节个数
with open(r'E:学习资料Python编程文件编程Myself38a.txt',mode='rt',encoding='utf-8') as fr:
fr.seek(4,0) # 指针现在正在第四个字节处
data = fr.read(3) # 从第4个字节向后读3个字符
print(data)
s i
truncate(n)
truncate(n)是截断文件,所以文件的打开方式必须可写,但是不能用w或w+等方式打开,因为那样直接清空文件了,所以truncate()要在r+或a或a+等模式下测试效果。它的参照物永远是文件头。并且truncate()不加参数,相当于清空文件。
with open(r'E:学习资料Python编程文件编程Myself38a.txt',mode='rt+',encoding='utf-8') as fr:
fr.truncate(3)
print(fr.read())
had