Python I/O(读写)详解 [文件路径][绝对路径][相对路径][打开指定文件][读写文件][关闭指定文件]

您的“关注”和“点赞”,是信任,是认可,是支持,是动力…

如意见相佐,可留言。
本人必将竭尽全力试图做到准确和全面,终其一生进行修改补充更新。

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+DC80U+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+ww+aa+ 的模式打开文件,否则执行 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 文件也被删除了。

【友情链接】

微信公众号:码农阿杰

博客园

【参考资料】

Python 官网

Python 3.8.2 documentation

猜你喜欢

转载自blog.csdn.net/manongajie/article/details/106398793