Python 文件


2021年8月23日, Learn eTutorial
2067

在本教程中,您将通过示例掌握 Python 文件和文件操作的所有知识。您将了解什么是文件,如何打开和关闭文件,以及在 Python 中读写文件的基本方法。

Python 中的文件是什么?

文件是系统存储上的一个命名位置,用于存储相关数据以供将来使用。数据可以是任何内容,例如简单的文本文件、视频或音频文件,或任何复杂的执行程序。我们使用文件系统在非易失性内存(如硬盘)中实现持久化存储。文件包含三个重要部分,如下所示。

  • 文件头保存文件的元数据,即文件的名称、大小、类型等详细信息。
  • 数据是文件中的内容,例如文本、图片、音频等。
  • EOF 表示文件结束。

接下来,在访问文件时,我们必须知道文件的存储位置。为此,我们使用文件路径,它提供了文件的路线或位置。文件路径包含 3 个部分,如下所示。

  • 文件夹路径指示文件所在文件夹的位置。
  • 文件名指示文件的实际名称。
  • 文件扩展名显示文件类型。

Python 中的文件类型

Python 中有两种文件。它们是

Types of files in python

Python 中的文件类型

  1. 二进制文件是包含非文本值(如图像、音频等)的文件。通常,二进制文件以零和一的形式包含对象。
  2. 文本文件是包含文本值的文件,这些文本值被结构化为行。简而言之,文本文件包含多行文本值。每行都以一个称为行结束符的特殊字符结尾。

当您想处理文件时,您需要执行 3 个基本操作,这些操作按处理顺序在下面列出。

  1. 打开文件
  2. 读取或写入操作
  3. 关闭文件
Flow chart for file handling

文件处理流程图

上面的流程图展示了 Python 中文件处理的工作流程。最初,我们需要创建一个文件。这可以由用户手动完成,只要他需要,并使用有效的文件名和扩展名保存。此外,Python 支持文件创建,您将在未来的会话中遇到。

如何在 Python 中打开文件

与文件进行的第一项也是最重要的操作是打开文件。可以通过调用 Python 内置函数 open() 来打开文件。open 函数返回文件对象,以后可以使用该文件对象来读取或写入文件。

open() 函数的基本语法是
File object = open(file_name [,access_mode] [,buffersize])

其中,

  • 文件名是强制性的字符串参数,用于指定文件名。
  • 是可选参数。它决定了文件的打开模式(r、w、a - 读取、写入、追加)。除此之外,我们还可以以文本模式或二进制模式打开文件。二进制模式用字母“b”表示。默认情况下,模式设置为文本读取,返回字符串。相反,二进制模式返回字节,因为它用于读取非文本文件,如图像或可执行文件。
  • 是另一个可选参数。默认缓冲区值为 0。当缓冲区值为一时,在文件访问期间会发生行缓冲。如果它大于 1,则会根据缓冲区的大小进行缓冲。

示例

open("testfile.txt")
open("testfile.txt",'r')
 

下表显示了不同的文件打开模式。

模式 含义 描述
r 读取 默认模式。以读取模式打开文件。如果文件不存在,则会引发错误
w 写入 以写入模式打开文件以覆盖。如果文件不存在,则创建文件
a 追加 在文件末尾追加文件,而不截断现有内容。如果文件不存在,则创建文件。
x 创建 创建指定的文件。如果文件已存在,则会引发错误。
b 二进制 以二进制模式打开文件
t 文本 以文本模式打开文件。默认模式。
r+ 读写 以读写模式打开文件
rb 二进制读取 以读取和二进制模式打开文件
rb+ 二进制读写 以二进制模式打开文件以进行读取和写入
w+ 读写 以写入和读取模式打开文件
wb 二进制写入 以写入和二进制模式打开文件
wb+ 二进制读写 以二进制模式打开文件以进行写入和读取
a+ 追加读写 以追加模式打开文件以进行读取和写入。
ab 二进制追加 以追加模式和二进制模式打开
ab+ 二进制追加读写 以读写二进制模式打开文件以进行追加

一旦创建了文件对象,就可以使用几个属性来获取文件的详细信息。下面列出了一些属性。

  • .closed: 当文件关闭时返回 True,否则返回 False
  • .mode: 返回文件打开的模式。
  • .name: 返回文件名。
  • .softspace: 如果 print 语句不需要显式空格,则返回 True,否则返回 False

注意:在以文本模式处理文件时,指定编码始终是一个好习惯。

如何在 Python 中关闭文件

关闭文件并非难事,但用户有责任在工作完成后正确关闭文件。Python 支持两种关闭文件的方法,如下例所示。

  1. 使用 close() 方法

    我们可以使用 Python 中可用的 close() 方法关闭已打开的文件。这会释放与文件关联的资源。

    f_obj = open(“testfile.txt”)
    ,.......................
    ,.......................
    f_obj.close()
    

    虽然这是一种简单的方法,但它有一个缺点,即仅使用 close 方法不能处理任何错误或异常。当遇到异常时,它会立即退出代码,而不会正确关闭文件。那么我们接下来应该怎么做?

    try...finally 块

    为了解决上述问题,我们可以使用 try..finally 块,它可以在出现异常时进行处理,从而确保文件正确关闭。

    try:
      f_obj = open(“testfile.txt”)
      ,.......................
      ,.......................
    finally:
    f_obj.close()
    
  2. 使用 with 语句

    在 Python 中,使用“with 语句”被认为是关闭文件的最佳方式。“with 语句”在退出“with 块”时会自动控制文件的关闭。因此,我们不需要在代码中显式指定 close() 方法。换句话说,使用“with 语句”可以更轻松地处理异常,并实现无错误的编码。

    with open(“testfile.txt”) as f_obj:
      ……………………………………
      …………………………………...
    finally:
    f_obj.close()
    

如何读取文件

打开文件后,我们可以对其执行所需的操作。可以对文件执行的两个操作是读取写入操作。首先,我们可以看看如何读取文件。要读取文件,首先要做的是以读取模式(r)打开文件。假设我们的文件名为 testfile.txt,其中包含以下内容,位于 Python 的同一目录中。

testfile.txt

Hello World
Welcome to Programming Tutorials
We Love Python
See You..Bye

下面是可用于读取文件的文件对象的三个方法。


read(size) 方法

使用此方法,我们可以将文件读取到指定的字节大小。

f_obj=open("testfile.txt",'r')
print(f_obj.read(6))  #reads the first 6 characters(Hello ) in the file
print(f_obj.read(4))  #reads the next 4 characters(Worl) in the file
f_obj.close()

在上面的示例中,size 指定为 6,因此它只读取前 6 个字符并返回。下一次 size 指定为 4,因此它在 Hello(前 6 个字符)之后读取文件中的下一个 4 个字符。这表明 read() 方法在每次函数调用后都会返回一个换行符。
read() 方法将 None 作为参数传递时,它会读取整个文件

  • 未将 None 作为参数传递
  • 将 -1 指定为参数大小
  • 未传递参数

以下示例对此概念进行了清晰的说明。

f_obj=open("testfile.txt",'r')
print(f_obj.read(-1)) 

输出

Hello World
Welcome to Programming Tutorials
We Love Python
See You..Bye

readline(size) 方法

此方法用于逐行读取文件,并逐行输出。让我们在下面的示例中看看 readline 方法是如何工作的。

f_obj=open("testfile.txt",'r')
print(f_obj.readline())  #reads first line in the file 
print(f_obj.readline())  #reads second line in the file 
print(f_obj.readline())  #reads third line in the file 
f_obj.close() 

输出

Hello World

Welcome to Programming Tutorials

We Love Python

同样,当参数为 None 或 -1 时,函数会逐行返回。但是,当我们指定大小后,情况会有所不同。它不会返回行,而是像 read 方法一样返回指定大小的字符。

f_obj=open("testfile.txt",'r')
print(f_obj.readline(6))
print(f_obj.readline(4))
print(f_obj.readline(-1))
f_obj.close() 

输出

Hello
Worl
d

readlines() 方法

readlines() 方法以列表的形式返回所有行。对于每一行,行尾用 \n 表示。上面的示例可以更改为

f_obj=open("testfile.txt",'r')
print(f_obj.readline(6))
print(f_obj.readline(4))
print(f_obj.readlines())  #returns remaining lines as a list
f_obj.close()

输出

Hello
Worl
['d\n', 'Welcome to Programming Tutorials\n', 'We Love Python\n', 'See You..Bye']

注意:当遇到 EOF 时,所有读取模式都将返回空值。


遍历文件中的行

逐行读取文件的另一种方法是遍历每一行。这可以通过使用 for 循环或 while 循环和 readlines 方法来完成。以下示例将演示打印文件行的两种不同方法。

with open("testfile.txt",'r') as f_obj:
 for line in f_obj:
  print(f_obj.readlines()) 

输出

(['Hello World\n', 'Welcome to Programming Tutorials\n', 'We Love Python\n', 'See You..Bye']

with open("testfile.txt",'r') as f_obj:
 for line in f_obj.readlines():
  print(line ,end =' ') 

输出

Hello World
 Welcome to Programming Tutorials
 We Love Python
 See You..Bye

但是,上面的示例可以更改为另一种形式以简化。这里我们不循环方法,而是迭代文件对象。

with open("testfile.txt",'r') as f_obj:
 for line in f_obj:
  print(line ,end =' ') 

输出

Hello World
 Welcome to Programming Tutorials
 We Love Python
 See You..Bye

如何写入文件

要写入文件,我们需要使用两种模式——写入模式和追加模式。我们已经讨论过,以写入模式打开的文件会被覆盖,擦除所有现有行。而以追加模式打开的文件会在不截断先前文本的情况下将新文本追加到文件中。用于向文件写入的内置方法是 write() 方法。

以下示例显示了写入模式和追加模式之间的区别

with open("testfile.txt",'w') as f_obj:
 f_obj.write('OVER WRITES FILES')

当我们执行上面的代码时,文本文件 textfile.txt 会被覆盖,如下图所示。

overwritten file

已覆盖的文件

现在我们以追加模式打开同一个文件,并将一些文本添加到文件中,如下面的示例所示。

with open("testfile.txt",'a') as f_obj:
 f_obj.write('Here iam opened the file in append mode and appends this statment') 

结果显示了显著的差异。这里文件没有被覆盖,而是将文本追加到现有文本的末尾。

append file

以追加模式打开文件

在写入或追加后查找文件差异的另一种方法是再次打开文件并以读取模式打印文件。

如何创建文件

要在 Python 中创建新文件,请使用以下任一模式打开文件。

x”=创建:创建一个文件,如果存在同名的文件,则返回错误。
a”=追加:如果指定的文件不存在,则创建文件。
w”=写入:如果指定的文件不存在,则创建文件

open('New_file_x.txt','x')
open('New_file_a.txt','a')
open('New_file_w.txt','w')

输出

Create a file

从上面的例子可以看出,Python 在您的系统中创建了 3 个文本文件。现在让我们看看当我们尝试创建现有文件时会发生什么。显然,Python 会引发一个错误,即 FileExistsError,如下图所示。

open('New_file_a.txt','x') 

输出

  open('New_file_a.txt','x')
FileExistsError: [Errno 17] File exists: 'New_file_a.txt'

为了规避此错误,我们可以将文件重命名为新名称,或删除现有文件(如果它不重要)。

如何重命名或删除文件

可以重命名或删除现有文件。重命名使用内置方法 os.rename(),删除文件使用内置方法 os.remove。这两个方法都位于 OS 模块中。因此,在执行任何这些任务之前,必须导入 OS 模块。OS 模块是 Python 标准实用模块的一部分,可帮助我们与操作系统进行交互,从而提供使用 OS 依赖的功能的方法。

重命名文件

rename 方法使用新名称更改现有文件的名称。rename 方法的基本语法是

os.rename(‘Current_File_name’,’New_File_name’) 

示例

import os
os.rename('New_file_x.txt','New.txt')
 

结果将在您的系统中得到反映,文件名称会发生更改。

删除文件

我们可以通过两种方式删除文件。一种方法是在系统中手动搜索文件并删除它。另一种方法是停留在交互式 shell 中并使用 Python 方法删除文件。

要删除文件,我们使用内置方法 os.remove(),其语法是

os.remove(‘File_name’) 

在尝试删除文件之前,我们需要检查它是否存在,以避免任何不必要的错误。我们可以使用 os.path.exists() 方法来检查文件是否存在,如下面的示例所示。

import os
if os.path.exists('New_file_a.txt'):
 os.remove('New_file_a.txt')
 print('Removed file')
else:
 print('File doesnot exist')
 

Python 文件方法

在本教程中,我们遇到了许多用于操作文件的方法。下表列出了 Python 中使用的所有文件方法。

方法 描述
close() 关闭已打开的文件。
fileno() 返回文件描述符的数量。
flush() 刷新文件流的写入缓冲区。
isatty() 当文件流是交互式的时返回 True,否则返回 False
read() 读取整个文件。
readable() 检查文件是否可读
readline() 逐行读取文件。
readlines() 读取整个文件并以列表形式返回
seek() 更改文件位置
seekable() 检查位置是否可更改
tell() 返回文件的当前位置
truncate() 将文件大小调整为指定大小。如果未指定,则调整到当前位置。
writable() 当文件可写时返回 True
write() 将指定字符串写入文件。
writelines() 将字符串列表或行写入文件。