Python-07-文件操作
文件操作
这里指的是针对一个文件的基本属性,比如路径,大小,名字,类型等,所以使用 os.path 来操作。
绝对和相对
相对路径可以用 ./XXX
或者 XXX
开头表示,是相对于 .py
代码文件的路径。
绝对路径可以用 E:/XXX
或者 /XXX
路径判断
判断路径是否存在 os.path.exists()
判断是否为文件 os.path.isfile()
判断是否为文件夹 os.path.isdir()
判断路径是否为绝对路径 os.path.isabs()
路径操作
分离路径和文件名 os.path.split()
分离文件名和拓展名 os.path.splitext()
将路径和文件名拼接返回绝对路径 os.path.join(path,name)
获取路径名 os.path.dirname()
获取文件名 os.path.basename()
获取文件大小 os.path.getsize()
获取文件夹下的所有文件 os.listdir()
文件属性操作
创建文件 open(“Name.txt”, “a”).close() 建议使用这个创建文件。
创建文件夹 os.mkdir() 和创建多个文件夹 os.makedirs()
重命名 os.rename(old,new)
删除文件 os.remove() 和删除多个文件 os.removedirs()
复制文件 shutil.copy()
移动文件 shutil.move()
读写文件
使用内建函数 open() 来实现文件的读写操作:
1 | file = open(file_name [, mode='r' [ , buffering=-1 [ , encoding = None ]]]) |
此格式中,用 [] 括起来的部分为可选参数,即可以使用也可以省略。其中,各个参数所代表的含义如下:
file:表示要创建的文件对象。
file_name:要创建或打开文件的文件名称,该名称要用引号(单引号或双引号都可以)括起来。需要注意的是,如果要打开的文件和当前执行的代码文件位于同一目录,则直接写文件名即可;否则,此参数需要指定打开文件所在的完整路径。
mode:可选参数,用于指定文件的打开模式。可选的打开模式如表 1 所示。如果不写,则默认以只读(r)模式打开文件。
buffering:可选参数,用于指定对文件做读写操作时,是否使用缓冲区(本节后续会详细介绍)。
encoding:手动设定打开文件时所使用的编码格式,不同平台的 ecoding 参数值也不同,以 Windows 为例,其默认为 cp936(实际上就是 GBK 编码)。
模式 | 意义 | 注意事项 |
---|---|---|
r | 只读模式打开文件,读文件内容的指针会放在文件的开头。 | 操作的文件必须存在。 |
rb | 以二进制格式、采用只读模式打开文件,读文件内容的指针位于文件的开头,一般用于非文本文件,如图片文件、音频文件等。 | ↑ |
r+ | 打开文件后,既可以从头读取文件内容,也可以从开头向文件中写入新的内容,写入的新内容会覆盖文件中等长度的原有内容。 | ↑ |
rb+ | 以二进制格式、采用读写模式打开文件,读写文件的指针会放在文件的开头,通常针对非文本文件(如音频文件)。 | ↑ |
w | 以只写模式打开文件,若该文件存在,打开时会清空文件中原有的内容。 | 若文件存在,会清空其原有内容(覆盖文件);反之,则创建新文件。 |
wb | 以二进制格式、只写模式打开文件,一般用于非文本文件(如音频文件) | ↑ |
w+ | 打开文件后,会对原有内容进行清空,并对该文件有读写权限。 | ↑ |
wb+ | 以二进制格式、读写模式打开文件,一般用于非文本文件 | ↑ |
a | 以追加模式打开一个文件,对文件只有写入权限,如果文件已经存在,文件指针将放在文件的末尾(即新写入内容会位于已有内容之后);反之,则会创建新文件。 | - |
ab | 以二进制格式打开文件,并采用追加模式,对文件只有写权限。如果该文件已存在,文件指针位于文件末尾(新写入文件会位于已有内容之后);反之,则创建新文件。 | - |
a+ | 以读写模式打开文件;如果文件存在,文件指针放在文件的末尾(新写入文件会位于已有内容之后);反之,则创建新文件。 | - |
ab+ | 以二进制模式打开文件,并采用追加模式,对文件具有读写权限,如果文件存在,则文件指针位于文件的末尾(新写入文件会位于已有内容之后);反之,则创建新文件。 | - |
对于二进制模式和文本模式的区别:
在 Windows 系统中,文件中用 \r\n 作为行末标识符(即换行符),当以文本格式读取文件时,会将 \r\n 转换成 \n;反之,以文本格式将数据写入文件时,会将 \n 转换成 \r\n。这种隐式转换换行符的行为,对用文本格式打开文本文件是没有问题的,但如果用文本格式打开二进制文件,就有可能改变文本中的数据(将 \r\n 隐式转换为 \n)。
文件读写
成功打开文件之后,获取的 file 对象可以完成对此文件的读写:
文件属性
file 对象包含如下属性:
file.name:返回文件的名称;
file.mode:返回打开文件时,采用的文件打开模式;
file.encoding:返回打开文件时使用的编码格式;
file.closed:判断文件是否己经关闭。
读取
一定要记得 open 的时候,设置的默认编码格式
file.read([size]) 可以限制一次读取的字节 or 字符数量,不写的话默认 全部读取 返回一个字节串或者字符串。
file.readline([size]) 一次读一行(包括最后的 \n),可以限制读取一行的 size 大小。
file.readlines() 按照行一次性读取所有内容,返回一个列表。
写
write() 往文件里面写入内容。如果要立刻看到写入效果,要么 close() 要么 flush()。
writelines(),将一个列表内容写入文件中,可以配合 readlines() 实现复制文件。
flush() 刷新缓存区,写入磁盘中。
文件位置指针
主要靠这 file.tell() 和 file.seek() 两个函数来得到当前文件指针位置,和将文件指针移动到对应位置。如果要使用,必须是以二进制模式打开文件!!!
file.tell() 返回当前文件指针位置。
file.seek(offset[, whence])
其中,各个参数的含义如下:
whence:作为可选参数,用于指定文件指针要放置的位置,该参数的参数值有 3 个选择:0 代表文件头(默认值)、1 代表当前位置、2 代表文件尾。
offset:表示相对于 whence 位置文件指针的偏移量,正数表示向后偏移,负数表示向前偏移。例如,当whence == 0 &&offset == 3(即 seek(3,0) ),表示文件指针移动至距离文件开头处 3 个字符的位置;当whence == 1 &&offset == 5(即 seek(5,1) ),表示文件指针向后移动,移动至距离当前位置 5 个字符处。
也就是根据 whence 选定参考点,根据 offset 设定偏移量,从而重新定位文件指针位置。
自动关闭
with as
Python 中也有和 Java 一样的 try(resource) 语句,用来自动控制上下文资源(文件,数据库链接等)。
1 | with 表达式 [as target]: |
此格式中,用 [] 括起来的部分可以使用,也可以省略。其中,target 参数用于指定一个变量,该语句会将 expression 指定的结果保存到该变量中。with as 语句中的代码块如果不想执行任何语句,可以直接使用 pass 语句代替。
上下文管理器
上下文 context,表示上文和下文…… 在编程里面,则指的是用来保存上文状态的东西。比如:
- 文件资源:里面就是保存各种文件信息的对象,可以叫做 上下文
- 进程资源:切换进程保存在 PCB 里面的东西,也可以叫做 上下文
- 数据库链接:保存数据库链接的东西,叫做 上下文
- 请求数据:保存请求携带的各种信息,也叫 上下文
就是要保存一下以前获得的东西,就叫上下文。而上下文管理器,就是管理上下文资源的对象,比如 Python 里面的 file。
file 对象实现了 __start__() __exit__()
因此就是上下文管理器,可以被 with as 语句所操作。