基本的文件操作
一、什么是文件?
文件是操作系统为用户或应用程序提供的一个读写硬盘的虚拟单位。文件的操作是基于文件,即文件的操作核心就是:读和写。也就是只要我们想要操作文件就是对操作系统发起请求,然后由操作系统将用户或应用程序对文件的读写操作转换成集体的硬盘指令(比如控制盘片转动,控制机械手臂移动,以此来读取数据)。
二、为什么要有文件?
内存无法永久保存数据,但凡我们想要永久保存数据都需要把文件保存到硬盘中,而操作文件就可以实现对硬件的操作。
三、如何使用文件
从硬盘中读取数据和写入数据。
打开文本的三种方式
readable()、writable()判断文本是否可读或可写,
for i in f:#一行一行读取文件
print(i)
#每一行末尾默认有一个换行
一、文件打开之r模式
r:read只读模式,只读不可写,文件不存在时会报错,且f.read()一次性读取文件的所有内容,如果文件非常大,会造成内存占满,电脑卡死,因此可以使用f.readline()/f.readlines()读取内容。
f = open('32.txt',mode='r')
f.write()
f.close()#报错
rt:只读不可写encoding指定读入的编码格式
# rt:read by text
# rb:read by bytes这里按照二进制位读取文件,不需要加读入的编码格式
f.read()读取文件指针会跑到文件的末端,如果再一次读取,读到的将会是空格。如果再次读取,只能将文件先关闭再次打开然后读取。
wt:只写不可读,w模式会先清空文件,再进行写入encoding指定写入的编码格式
r、rt | 只读不可写encoding指定读入的编码格式,如果对应的地址没有文件则会报错。 |
---|---|
w、wt | 只写不可读,w模式会先清空文件,如果没有文件会自动创建文件,再进行写入encoding指定写入的编码格式。 |
at | 只写入(追加写入)文件不存在的时候会先创建文件后写入内容。 |
b | 该模式用于读取文件的二进制数,一般用于图片、音频、视频,在读取的时候不能加encoding |
绝对路径和相对路径
绝对路径:从盘符开始的路径
相对路径:执行文件(当前运行的文件)的文件夹下的文件名
未来写项目尽量用相对路径,执行文件和要编辑的文件放在同一个文件夹下。
with 管理文件上下文
with open()方法不仅提供自动释放操作系统占用的方法,并且with open可以使用逗号分隔,一次性打开多个文件,实现文件的快速拷贝。
# with提供了一个自动关闭文件机制,with open 下面的文件运行结束之后就会关闭文件。
with open ('test.py',)
文件的高级应用(有弊端仅了解)
- r+t: 可读、可写
- w+t: 可写、可读
- a+t: 可追加、可读
r+默认为r+t 把第一个字替换掉,
a+ a模式默认在光标尾部。
这些方法都有一定的弊端,如果你用既可读又可写的形式打开了一个文件,往里头写东西,然后又读,有可能出现读取不到刚写进去的东西,因为写的过程存在时间延迟,如果这时你以为没有写入成功而重新写入一次,就会报错。
光标的高级应用
在python会有指针的概念但是这里的指针和c语言不同,这里的指针仅指光标的位置,指针在哪里你写的字符就在那里。
-
seek(offset,whence):offset代表指针的偏移量,偏移的单位是字节的个数(utf8的每三个字节为一个字符)
-
tell():每次统计从文件开头到指针所在位置
with open('36.txt','rb') as fr: fr.seek(4,0) print(f"fr.tell():{fr.tell()}") fr.tell():4
-
read(n): 这里n代表字符的个数,除此之外,其他地方涉及到指针都是指字节个数。
with open('36.txt','rt',encoding='utf-8') as fr: print(f"fr.read(3):{fr.read(3)}") fr.read(3): sdf
-
truncate(n): truncate(n)是截断文件,所以文件的打开方式必须是可写,但不能用w、w+等方式打开,因为这两种方式都会先清空文件。所以要在r、r+、a、a+模式下使用,他的参照物永远是文件头,且truncate()括号内不加参数相当于清空文件。如果以两字节为单位截取utf8格式文件,则文件会变成乱码。
修改文件的两种方式
-
方式一
将硬盘中存放的需要修改的文件的内容全部加载到内存,在内存中修改完毕后,再由内存覆盖到硬盘。
import os with open('34r.txt') as fr, open('34r_swap.txt','w') as fw: data =fr.read() data = data.replace('tank','tankSB')#在内存中完成修改 fw.write(data)#新文件一次性写入原文件内容 os.remove('34r.txt') os.rename('34r_swap.txt','34r.txt') print('done...')
done...
-
方式二
将硬盘内的文件内容一行一行的读入内存,修改完成后写入新文件,之后覆盖原文件。
import os with open('34r.txt') as fr, open('34r_swap.txt','w') as fw: #循环读取内容,逐行修改 for line in fr: line = line,replace('jason','jasonSB') #新文件写入原文件修改后文件 fw.write(line) os.remove('34r.txt') os.rename('34r_swap.txt','34r.txt') print('done...')
done...