如何在 Python 中检查文件是否可写

PythonPythonBeginner
立即练习

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

简介

在这个实验中,你将学习如何在 Python 中检查文件是否可写。本实验重点在于理解 Linux 环境下的文件写入权限,并演示两种验证写入权限的方法。

首先,你将探索 Linux 文件权限,包括所有者、组和其他用户的概念,以及读取、写入和执行权限。你将创建一个文件,使用 ls -l 查看其默认权限,并解读输出结果。然后,你将学习如何结合 os.W_OK 使用 os.access(),并尝试以写入模式打开文件,从而在 Python 中确定文件是否可写。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL python(("Python")) -.-> python/FunctionsGroup(["Functions"]) python(("Python")) -.-> python/ErrorandExceptionHandlingGroup(["Error and Exception Handling"]) python(("Python")) -.-> python/FileHandlingGroup(["File Handling"]) python(("Python")) -.-> python/PythonStandardLibraryGroup(["Python Standard Library"]) python/FunctionsGroup -.-> python/build_in_functions("Build-in Functions") python/ErrorandExceptionHandlingGroup -.-> python/catching_exceptions("Catching Exceptions") python/FileHandlingGroup -.-> python/file_opening_closing("Opening and Closing Files") python/FileHandlingGroup -.-> python/file_reading_writing("Reading and Writing Files") python/FileHandlingGroup -.-> python/file_operations("File Operations") python/PythonStandardLibraryGroup -.-> python/os_system("Operating System and System") subgraph Lab Skills python/build_in_functions -.-> lab-559514{{"如何在 Python 中检查文件是否可写"}} python/catching_exceptions -.-> lab-559514{{"如何在 Python 中检查文件是否可写"}} python/file_opening_closing -.-> lab-559514{{"如何在 Python 中检查文件是否可写"}} python/file_reading_writing -.-> lab-559514{{"如何在 Python 中检查文件是否可写"}} python/file_operations -.-> lab-559514{{"如何在 Python 中检查文件是否可写"}} python/os_system -.-> lab-559514{{"如何在 Python 中检查文件是否可写"}} end

了解写入权限

在这一步中,我们将探索 Linux 环境下写入权限的概念。理解文件权限对于控制对文件和目录的访问至关重要。特别是写入权限,它决定了你是否可以修改文件或目录。

在 Linux 中,每个文件和目录都为三类用户设置了一组权限:

  • 所有者(Owner):拥有该文件或目录的用户。
  • 组(Group):文件或目录所属的组。
  • 其他用户(Others):系统上的所有其他用户。

对于每一类用户,有三种类型的权限:

  • 读取(Read,r):允许你查看文件内容或列出目录中的内容。
  • 写入(Write,w):允许你修改文件,或在目录中创建、删除或重命名文件。
  • 执行(Execute,x):允许你执行文件(如果它是一个程序)或进入目录。

让我们从创建一个文件并查看其默认权限开始。打开 VS Code 编辑器,在 ~/project 目录下创建一个名为 my_file.txt 的新文件。目前你可以让文件保持为空。

接下来,打开终端并导航到 ~/project 目录:

cd ~/project

现在,让我们使用 ls -l 命令查看文件的权限:

ls -l my_file.txt

你会看到类似如下的输出:

-rw-rw-r-- 1 labex labex 0 Oct 26 14:35 my_file.txt

让我们来分析一下这个输出:

  • 第一个字符 (-) 表示这是一个文件(而目录的标识字符是 d)。
  • 接下来的九个字符 (rw-rw-r--) 代表权限。
    • 前三个 (rw-) 是所有者的权限(读取和写入)。
    • 接下来的三个 (rw-) 是组的权限(读取和写入)。
    • 最后三个 (r--) 是其他用户的权限(只读)。
  • 1 表示文件的硬链接数量。
  • labex labex 分别是所有者和组的名称。
  • 0 是文件的大小(以字节为单位)。
  • Oct 26 14:35 是最后修改的时间戳。
  • my_file.txt 是文件名。

目前,所有者(你,即 labex)和组拥有读取和写入权限,而其他用户只有读取权限。这意味着你可以修改文件,但系统上的其他用户只能查看它。

现在,让我们尝试使用 chmod 命令移除所有者的写入权限。chmod 用于更改文件权限。

chmod u-w my_file.txt

这里,u-w 表示“移除所有者的写入权限”。

现在,让我们再次检查权限:

ls -l my_file.txt

输出现在应该如下所示:

-r--rw-r-- 1 labex labex 0 Oct 26 14:35 my_file.txt

注意,所有者的权限现在变为 r--,表示只读访问。

在接下来的步骤中,我们将了解如何使用 Python 检查写入权限,并处理权限不足的情况。

结合 os.W_OK 使用 os.access()

在上一步中,我们了解了文件权限以及如何使用 chmod 命令修改它们。现在,让我们探索如何使用 Python 以编程方式检查文件是否具有写入权限。os.access() 函数与 os.W_OK 常量结合使用,就可以实现这一功能。

os.access() 函数接受两个参数:

  • path:你要检查的文件或目录的路径。
  • mode:一个整数,表示你要检查的权限。

os.W_OK 常量表示写入权限。当与 os.access() 一起使用时,它会检查指定的文件或目录是否可由当前用户写入。

让我们创建一个 Python 脚本来演示这一点。打开 VS Code 编辑器,在 ~/project 目录下创建一个名为 check_write_permission.py 的新文件。

在文件中添加以下代码:

import os

file_path = "my_file.txt"

if os.access(file_path, os.W_OK):
    print(f"The file '{file_path}' is writable.")
else:
    print(f"The file '{file_path}' is not writable.")

以下是代码的功能说明:

  1. 导入 os 模块,该模块提供了与操作系统交互的函数。
  2. 定义一个变量 file_path,用于存储我们要检查的文件的名称(即上一步中创建的 my_file.txt)。
  3. 使用 os.access(file_path, os.W_OK) 检查文件是否可写。
  4. 打印一条消息,指示文件是否可写。

现在,让我们运行这个脚本。打开终端并导航到 ~/project 目录(如果你还没有在该目录下):

cd ~/project

然后,执行 Python 脚本:

python check_write_permission.py

由于我们在上一步中移除了所有者的写入权限,输出应该是:

The file 'my_file.txt' is not writable.

现在,让我们将文件的写入权限重新赋予所有者:

chmod u+w my_file.txt

再次运行 Python 脚本:

python check_write_permission.py

这次,输出应该是:

The file 'my_file.txt' is writable.

这展示了如何在 Python 中使用 os.access()os.W_OK 以编程方式检查写入权限。这对于编写需要修改文件但首先需要确保具有必要权限的程序非常有用。

尝试以写入模式打开文件

在这一步中,我们将了解当我们在没有必要权限的情况下尝试以写入模式打开文件时会发生什么。这将帮助我们理解 Python 如何处理权限错误。

首先,让我们再次移除 my_file.txt 的写入权限:

chmod u-w my_file.txt

现在,让我们创建一个 Python 脚本,尝试以写入模式打开该文件。打开 VS Code 编辑器,在 ~/project 目录下创建一个名为 attempt_write.py 的新文件。

在文件中添加以下代码:

file_path = "my_file.txt"

try:
    with open(file_path, "w") as f:
        f.write("This is a test.")
    print("File written successfully.")
except Exception as e:
    print(f"Error writing to file: {e}")

以下是代码的功能说明:

  1. 定义一个变量 file_path,用于存储我们要写入的文件的名称。
  2. 使用 try...except 块来处理可能出现的错误。
  3. try 块中,尝试以写入模式 ("w") 打开文件。
  4. 如果文件成功打开,则将字符串 "This is a test." 写入文件。
  5. 如果发生错误(例如,由于缺少写入权限),except 块将捕获异常并打印错误消息。

现在,让我们运行这个脚本:

python attempt_write.py

由于我们移除了写入权限,你应该会看到类似以下的输出:

Error writing to file: [Errno 13] Permission denied: 'my_file.txt'

这证实了当我们在没有必要权限的情况下尝试以写入模式打开文件时,Python 会抛出 PermissionError(具体为 Errno 13)。

现在,让我们恢复写入权限:

chmod u+w my_file.txt

再次运行脚本:

python attempt_write.py

这次,输出应该是:

File written successfully.

如果你查看 my_file.txt 的内容,会发现它现在包含文本 "This is a test.":

cat my_file.txt
This is a test.

这展示了 Python 在尝试以写入模式打开文件时如何处理权限错误。在你的程序中,使用 try...except 块来捕获这些错误并妥善处理它们是很重要的。

总结

在本次实验中,我们首先探讨了 Linux 中写入权限的概念,了解到这些权限控制着修改文件和目录的能力。我们学习了三类用户(所有者、组、其他用户)以及三种权限类型(读取、写入、执行)。

接着,我们创建了一个名为 my_file.txt 的文件,并使用 ls -l 命令查看其默认权限,剖析输出结果以理解每种用户类别下权限的表示方式。这为理解如何在 Python 中以编程方式检查写入权限奠定了基础。