您的“关注”和“点赞”,是信任,是认可,是支持,是动力…
如意见相佐,可留言。
本人必将竭尽全力试图做到准确和全面,终其一生进行修改补充更新。
文章目录
1 Python 文件路径
1.1 文件路径概述
程序运行,数据传递,数据都是暂时存储在变量、序列以及对象中的,程序结束,数据就丢失了。
为了在程序结束后数据仍然存在,就需要将数据保存到文件中。
Python 提供了内置的文件对象,以及对文件、目录(文件夹)进行操作的内置模块,通过这些支持就可以很方便地将数据保存到文件中了。
文件的两个属性,如下所示,
- 文件名:为文件定义的名称。
- 路径:用来指明文件在计算机上的位置。在 Windows 上,路径书写使用反斜杠
\
作为文件夹之间的分隔符。例如,D:\Data\demo
,这个路径中D:\
表示根文件夹,根文件夹包含所有其他文件夹,根文件夹也可叫做“D 盘”。
1.2 绝对路径和相对路径
路径是用来指明一个文件在计算机上的位置,文件的路径有以下两种表示方式,
- 绝对路径:总是从根文件夹开始,Windows 系统中是以盘符(例如C:、D:等)作为根文件夹。
- 相对路径:指的是文件(要查找的文件 A)相对于当前工作目录(当前操作的文件 B 所在的目录)所在的位置。例如:如果文件 A 在当前工作目录中,文件 A 路径为
文件名.扩展名
;如果文件 A 在当前工作目录的下一级,文件路径为下级目录名\文件名.扩展名
,以此类推;如果文件在当前工作目录的上一级目录中,文件路径为..\文件名.扩展名
,以此类推,每多一级目录多加一个..\
。
2 Python 文件的基本操作
2.1 文件基本操作概述
Python 中,对文件的操作有很多种,常见的基本操作有作用于文件本身的,例如创建文件、删除文件、修改文件权限等;也有作用于文件内容的,例如对文件进行读写操作等。
- 对文件本身的操作:对文件本身的操作功能比较单一,实现较简单,Python 给予了很好的支持,有专用模块(例如 os、sys 等),并调用模块中的指定函数就可以实现。请参见博文《Python os 模块详解》。更新中 …
- 对文件内容的操作,通常需要按照固定的步骤进行操作,具体步骤如下所示,
第一步,打开文件:使用open()
函数,该函数会返回一个文件对象;
第二步,对已打开文件做读/写操作:读取文件内容可使用read()
、readline()
以及readlines()
函数;向文件中写入内容,可以使用write()
函数。
第三步,关闭文件:对文件的读/写操作完成之后,需要关闭文件,可以使用close()
函数。
2.2 打开指定文件
在 Python 中,操作文件首先需要创建或者打开指定的文件,并创建一个文件对象,可以通过 Python 的内置函数 open()
实现。
使用格式如下所示:
file = open(file_name, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)
对以上格式说明(参考 python-3.8.2-docs),
-
返回值:open() 函数用于创建或打开指定文件,返回一个文件对象。
-
file
:是变量名,会把 open() 函数返回的文件对象赋值给这个变量。 -
file_name
:是文件名称,要创建或打开的文件名称。此参数接收一个字符串参数,意指要把文件名用引号(单引号或双引号)括起来。 -
mode
:可选参数,用于指定文件的打开模式。可选的打开模式有很多,常用参数值如下表所示(仅供参考,以具体效果为准)。如果不写,则默认为r
模式打开文件,即只读模式打开文件。字符 意义 ‘r’ 操作的文件必须存在。读取(默认),只读模式打开文件 ‘rb’ 操作的文件必须存在。以二进制格式、采用只读模式打开文件,通常用于非文本文件 ‘w’ 若文件存在,会清空其原有内容(覆盖文件);若文件不存在,则创建新文件。以只写模式打开文件 ‘wb’ 若文件存在,会清空其原有内容(覆盖文件);若文件不存在,则创建新文件。以二进制格式、只写模式打开文件,通常用于非文本文件 ‘x’ 排它性创建,如果文件已存在则失败 ‘a’ 只写,如果文件存在则在末尾追加;如果文件不存在,则创建新文件 ‘b’ 二进制模式 ‘t’ 文本模式(默认) ‘+’ 打开用于更新(读取与写入) -
buffering
:可选参数,对文件做读写操作时,是否使用缓冲区(建议打开缓冲区)。如果 buffing 参数的值为 0(或者 False),则表示在打开指定文件时不使用缓冲区;如果 buffing 参数值为大于 1 的整数,该整数用于指定缓冲区的大小(单位是字节);如果 buffing 参数的值为负数,则代表使用默认的缓冲区大小。对于以文本格式打开的文件,必须使用缓冲区,否则 Python 解释器会报 ValueError 错误。以二进制格式打开的文件,可以不使用缓冲区,写入的数据会直接进入磁盘文件 -
encoding
:是用于解码或编码文件的编码的名称。指的是手动设置打开文件时所使用的编码格式。不同平台的 ecoding 参数值也不同,以 Windows 为例,其默认为cp936
(实际上就是 GBK 编码)。手动修改 encoding 参数的值,仅限于文件以文本的形式打开,也就是说,以二进制格式打开时,不能对 encoding 参数的值做任何修改,否则程序会抛出ValueError
异常。 -
errors
:是一个可选的字符串参数,用于指定如何处理编码和解码错误,不能在二进制模式下使用。可以使用各种标准错误处理程序,但是使用codecs.register_error()
注册的任何错误处理名称也是有效的。标准名称包括:
(1)如果存在编码错误,‘strict’ 会引发 ValueError 异常。 默认值 None 具有相同的效果。
(2)‘ignore’ 忽略错误。请注意,忽略编码错误可能会导致数据丢失。
(3)‘replace’ 会将替换标记(例如 ‘?’ )插入有错误数据的地方。
(4)‘surrogateescape’ 将表示任何不正确的字节作为 Unicode 专用区中的代码点,范围从U+DC80
到U+DCFF
。当在写入数据时使用 surrogateescape 错误处理程序时,这些私有代码点将被转回到相同的字节中。这对于处理未知编码的文件很有用。
(6)只有在写入文件时才支持 ‘xmlcharrefreplace’。编码不支持的字符将替换为相应的 XML 字符引用&#nnn;
。
(7)‘backslashreplace’ 用 Python 的反向转义序列替换格式错误的数据。
(8)‘namereplace’ (也只在编写时支持)用\N{...}
转义序列替换不支持的字符。 -
newline
: 控制 universal newlines 模式如何生效(它仅适用于文本模式)。它可以是None
,''
,\n
,\r
和\r\n
。它的工作原理:
(1)从流中读取输入时,如果 newline 为 None,则启用通用换行模式。输入中的行可以以\n
,\r
或\r\n
结尾,这些行被翻译成\n
在返回呼叫者之前。如果它是''
,则启用通用换行模式,但行结尾将返回给调用者未翻译。如果它具有任何其他合法值,则输入行仅由给定字符串终止,并且行结尾将返回给未调用的调用者。
(2)将输出写入流时,如果 newline 为 None,则写入的任何\n
字符都将转换为系统默认行分隔符os.linesep
。如果 newline 是''
或\n
,则不进行翻译。如果 newline 是任何其他合法值,则写入的任何\n
字符将被转换为给定的字符串。 -
closefd
:如果 closefd 是 False 并且给出了文件描述符而不是文件名,那么当文件关闭时,底层文件描述符将保持打开状态。如果给出文件名则 closefd 必须为 True (默认值),否则将引发错误。 -
opener
:可以通过传递可调用的 opener 来使用自定义开启器。然后通过使用参数( file,flags )调用 opener 获得文件对象的基础文件描述符。 opener 必须返回一个打开的文件描述符(使用 os.open as opener 时与传递 None 的效果相同)。
举例如下图所示:
例一,输出了 file 文件对象的相关信息,包括打开文件的名称、打开模式、打开文件时所使用的编码格式。
例二,open() 文件对象的常用属性
成功打开文件之后,可以调用文件对象本身拥有的属性获取当前文件的部分信息,其常见的属性为:
name
:返回文件的名称。mode
:返回打开文件时,采用的文件打开模式。encoding
:返回打开文件时使用的编码格式。closed
:判断文件是否己经关闭。
举例如下图所示:
注意:使用 open() 函数打开的文件对象,必须手动进行关闭(在 2.4 小节 关闭指定文件,会介绍),Python 垃圾回收机制无法自动回收打开文件所占用的资源。
2.3 对文件做 I/O (读写)操作
(1)读取文件中的数据。
Python read() 函数:逐个字节或者字符读取文件中的内容
使用 read()
函数读取文件内容,除了严格遵守 read() 的语法外,其还要求 open() 函数必须以可读默认(包括 r、r+、rb、rb+)打开文件。
- 对于文件是以文本模式(非二进制模式)打开的,则 read() 函数会逐个字符进行读取。
- 对于文件以二进制模式打开的,则 read() 函数会逐个字节进行读取。
注意:当操作文件结束后,必须调用 close() 函数手动将打开的文件进行关闭,这样可以避免程序发生不必要的错误。
使用 read() 函数的基本语法格式如下所示:
file.read([size])
对以上格式说明,
file
:变量名,open() 函数的返回值(文件对象)会赋值给它。size
:可选参数,用于指定一次最多可读取的字符(字节)个数,如果省略,则默认一次性读取所有内容。
举例如下所示:
例一,
创建一个 test.txt
文本文件,内容如下所示:
码农阿杰
在与 test.txt
文件同目录下创建 demo.py
Python 文件,如下图所示:
我用的 PyCharm 工具,默认编码格式为 UTF-8 。
例二,
使用 size
参数,指定 read() 每次可读取的最大字符(或者字节)数。
创建一个 test.txt
文本文件,内容如下所示:
码农阿杰
在与 test.txt
文件同目录下创建 demo.py
Python 文件,如下图所示:
例三,
对于以二进制格式打开的文件,read() 函数会逐个字节读取文件中的内容。
如果输出到控制台的话,数据为 bytes 字节序列。我们可以调用 decode() 方法,将其转换成我们认识的字符串。对于字节序列,可参见博文《Python 二进制序列(字节序列)类型之一:bytes 》。
创建一个 test.txt
文本文件,内容如下所示:
码农阿杰
在与 test.txt
文件同目录下创建 demo.py
Python 文件,如下图所示:
Python readline() 函数:逐行读取文件中的内容
readline()
函数用于读取文件中的一行,包含最后的换行符\n
。
使用 open() 函数指定打开文件的模式必须为可读模式(包括 r、rb、r+、rb+ 4 种),否则此函数无法成功读取文件数据。
使用此函数的基本语法格式如下所示:
file.readline([size])
对以上格式说明,
file
:表示文件对象。size
:为可选参数,用于指定读取每一行时,一次最多读取的字符(字节)数。
举例如下所示:
例一,
创建一个 test.txt
文本文件,内容如下所示:
码农阿杰
https://blog.csdn.net/manongajie
在与 test.txt
文件同目录下创建 demo.py
Python 文件,如下图所示:
例二,
使用 size
参数,指定 readline() 每次可读取的最大字符(或者字节)数。
创建一个 test.txt
文本文件,内容如下所示:
码农阿杰
https://blog.csdn.net/manongajie
在与 test.txt
文件同目录下创建 demo.py
Python 文件,如下图所示:
Python readlines() 函数:一次性读取文件中多行内容
readlines()
函数用于读取文件中的所有行,返回的是一个字符串列表,其中每个元素为文件中的一行内容。
readlines() 函数在读取每一行时,会连同行尾的换行符 \n
一起读取。
要想成功读取文件中的数据,打开文件的模式必须为可读模式(包括 r、rb、r+、rb+ 4 种)。
使用 readlines() 函数的基本语法格式如下所示:
file.readlines()
对以上格式说明,
file
:表示文件对象。
举例如下所示:
创建一个 test.txt
文本文件,内容如下所示:
码农阿杰
https://blog.csdn.net/manongajie
在与 test.txt
文件同目录下创建 demo.py
Python 文件,如下图所示:
(2)向文件中写入数据
Python write() 函数
Python 文件对象(open() 函数的返回值)提供了 write()
函数,可以向文件中写入指定内容。
在使用 write() 函数向文件中写入数据时,要保证使用 open() 函数是以 r+
、w
、w+
、a
或 a+
的模式打开文件,否则执行 write() 函数会抛出 io.UnsupportedOperation
错误。
使用语法格式如下所示:
file.write(string)
对以上语法格式说明,
file
:变量名,已打开的文件对象会赋值给它。string
: 表示要写入文件的字符串。注意:写入二进制文件的是字节序列。
举例如下所示:
创建一个 test.txt
文件,该文件内容如下所示:
码农阿杰
然后,在和 test.txt
文件同级目录下,创建一个 demo.py
文件,内容如下图所示:
再打开 test.txt
文件,看到的内容如下所示:
大帅哥
因为,如果打开文件模式为 w
(写入),那么向文件中写入内容时,会先清空原文件中的内容,然后再写入新的内容。
如果打开文件模式为 a
(追加),则不会清空原有内容,而是将新写入的内容追加到原内容后边。就不再举例了,读者可以根据上例自己去修改一下。
Python writelines() 函数
Python 文件对象提供的 writelines()
函数,可以实现将字符串列表写入文件中。
举例如下所示:
创建一个 test.txt
文件,该文件内容如下所示:
大帅哥
然后,在和 test.txt
文件同级目录下,创建一个 demo.py
文件,内容如下图所示:
再打开 test.txt
文件,看到的内容如下所示:
码农阿杰
https://blog.csdn.net/manongajie
2.4 关闭指定文件
close()
函数是专门用来关闭已打开文件对象的。
语法格式如下所示:
file.close()
对以上格式说明,
file
:表示已打开的文件对象。
使用 open() 函数打开的文件,在操作完成之后,一定要调用 close() 函数将其关闭,否则程序的运行可能出现问题。
举例如下所示:
创建一个 test.txt
文本文件,内容如下所示:
码农阿杰
并在同级目录中创建 demo.py
Python 文件,内容如下图所示:
从上面的运行结果可以看出,报错了,是因为使用 open() 函数打开了 test.txt
文件,但没有及时关闭,直接导致后面的 remove() 函数运行出现错误。
使用 open() 函数打开 test.txt
文件,并及时关闭,如下图所示:
从运行结果看,没有报错,并且 test.txt
文件也被删除了。