文件操作

这里指的是针对一个文件的基本属性,比如路径,大小,名字,类型等,所以使用 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 编码)。

339.jpg

表 1 open 函数支持的文件打开模式
模式 意义 注意事项
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])

其中,各个参数的含义如下:

  1. whence:作为可选参数,用于指定文件指针要放置的位置,该参数的参数值有 3 个选择:0 代表文件头(默认值)、1 代表当前位置、2 代表文件尾。

  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
2
with 表达式 [as target]:  
代码块

此格式中,用 [] 括起来的部分可以使用,也可以省略。其中,target 参数用于指定一个变量,该语句会将 expression 指定的结果保存到该变量中。with as 语句中的代码块如果不想执行任何语句,可以直接使用 pass 语句代替。

上下文管理器

上下文 context,表示上文和下文…… 在编程里面,则指的是用来保存上文状态的东西。比如:

  1. 文件资源:里面就是保存各种文件信息的对象,可以叫做 上下文
  2. 进程资源:切换进程保存在 PCB 里面的东西,也可以叫做 上下文
  3. 数据库链接:保存数据库链接的东西,叫做 上下文
  4. 请求数据:保存请求携带的各种信息,也叫 上下文

就是要保存一下以前获得的东西,就叫上下文。而上下文管理器,就是管理上下文资源的对象,比如 Python 里面的 file。

file 对象实现了 __start__() __exit__() 因此就是上下文管理器,可以被 with as 语句所操作。