介绍
在这个实验中,你将学习如何在 Python 中检查文件是否可读。实验首先会探讨 Linux 中的文件权限,重点介绍所有者、用户组和其他用户的概念,以及读、写和执行权限。你将创建一个 Python 脚本,使用 ls -l 命令查看其权限,并解读输出结果,以了解谁有权限读取该文件。
接着,实验会指导你使用 Python 的 os.access() 函数和 os.R_OK 来以编程方式判断文件是否可读。最后,你将学习如何在 try...except 代码块中尝试打开文件进行读取,以处理可能出现的 IOError 异常,这为你在 Python 代码中验证文件可读性提供了一种实用的方法。
理解文件权限
在这一步中,我们将探讨 Linux 中的文件权限,这对于控制对文件和目录的访问至关重要。理解文件权限对于确保数据的安全性和完整性至关重要。
Linux 中的每个文件和目录都有相关的权限,这些权限决定了谁可以读取、写入或执行它们。这些权限分为三类:
- 所有者(Owner):拥有该文件或目录的用户。
- 用户组(Group):文件或目录所属的用户组。
- 其他用户(Others):系统上的所有其他用户。
每一类都有三种类型的权限:
- 读取(Read,r):允许用户查看文件的内容或列出目录的内容。
- 写入(Write,w):允许用户修改文件的内容,或在目录中创建、删除或重命名文件。
- 执行(Execute,x):允许用户将文件作为程序执行,或进入该目录。
让我们从创建一个文件并查看其权限开始。打开 VS Code 编辑器,在 ~/project 目录中创建一个名为 my_script.py 的新文件。将以下内容添加到文件中:
print("Hello, world!")
保存文件。现在,打开终端并导航到 ~/project 目录:
cd ~/project
使用 ls -l 命令列出目录中的文件并显示详细信息:
ls -l
你应该会看到类似以下的输出:
-rw-r--r-- 1 labex labex 22 Oct 26 10:00 my_script.py
让我们来分析一下这个输出:
- 前 10 个字符表示文件权限。
- 第一个字符表示文件类型:
-表示普通文件,d表示目录,l表示符号链接等。 - 接下来的三个字符 (
rw-) 表示所有者的权限:读取和写入。 - 再接下来的三个字符 (
r--) 表示用户组的权限:只读。 - 最后三个字符 (
r--) 表示其他用户的权限:只读。 1表示文件的硬链接数量。labex labex表示文件的所有者和用户组。22是文件的大小(以字节为单位)。Oct 26 10:00是文件的最后修改时间。my_script.py是文件名。
目前,文件 my_script.py 对所有者(你)有读取和写入权限,对用户组和其他用户只有只读权限。这意味着你可以读取和修改该文件,但其他用户只能读取它。
要执行这个 Python 脚本,你需要执行权限。让我们尝试运行这个脚本:
python my_script.py
你应该会看到以下输出:
Hello, world!
即使该文件没有执行权限,你仍然可以使用 python 解释器来执行它。python 命令本身具有执行权限,它可以读取并执行 my_script.py 文件的内容。
在接下来的步骤中,我们将探讨如何使用 Python 检查文件权限,以及如何使用 Linux 命令更改这些权限。
结合 os.R_OK 使用 os.access()
在这一步中,我们将使用 Python 中的 os.access() 函数来检查文件是否具有读取权限。os.access() 函数接受两个参数:文件路径和权限标志。我们将使用 os.R_OK 来检查读取权限。
首先,让我们在 ~/project 目录中创建一个名为 check_permissions.py 的新 Python 文件。打开 VS Code 编辑器,并将以下代码添加到文件中:
import os
file_path = "my_script.py"
## Check if the file exists
if not os.path.exists(file_path):
print(f"Error: The file '{file_path}' does not exist.")
else:
## Check if the file has read permissions
if os.access(file_path, os.R_OK):
print(f"The file '{file_path}' has read permissions.")
else:
print(f"The file '{file_path}' does not have read permissions.")
保存文件。这个脚本首先检查 my_script.py 文件是否存在。如果存在,它会使用 os.access() 和 os.R_OK 来检查文件是否具有读取权限。脚本会打印一条消息,指示文件是否具有读取权限。
现在,从终端运行脚本:
python check_permissions.py
你应该会看到以下输出:
The file 'my_script.py' has read permissions.
这是因为默认情况下,my_script.py 文件对所有者、用户组和其他用户都有读取权限。
现在,让我们修改 my_script.py 文件的权限,以移除除所有者之外的所有人的读取权限。我们可以在终端中使用 chmod 命令来完成此操作。
chmod 600 my_script.py
此命令将 my_script.py 的权限设置为仅所有者具有读取和写入权限(八进制表示为 600)。
现在,再次运行 check_permissions.py 脚本:
python check_permissions.py
你现在应该会看到以下输出:
The file 'my_script.py' does not have read permissions.
这是因为我们已经移除了用户组和其他用户的读取权限。os.access() 函数正确识别出运行脚本的用户(即 labex)对该文件不再具有读取权限。
最后,让我们恢复 my_script.py 文件的原始权限:
chmod 644 my_script.py
此命令将 my_script.py 的权限设置为所有者具有读取和写入权限,用户组和其他用户具有只读权限(八进制表示为 644)。
尝试以读取模式打开文件
在这一步中,我们将尝试在 Python 里以读取模式打开 my_script.py 文件,并处理可能出现的 PermissionError 异常。这将展示如何妥善处理脚本没有足够权限访问文件的情况。
首先,像上一步那样,修改 my_script.py 文件的权限,移除除所有者之外其他用户的读取权限:
chmod 600 my_script.py
现在,在 ~/project 目录下创建一个名为 open_file.py 的新 Python 文件。打开 VS Code 编辑器,将以下代码添加到文件中:
file_path = "my_script.py"
try:
with open(file_path, "r") as file:
content = file.read()
print("File content:")
print(content)
except PermissionError:
print(f"Error: You do not have permission to read the file '{file_path}'.")
except FileNotFoundError:
print(f"Error: The file '{file_path}' was not found.")
except Exception as e:
print(f"An unexpected error occurred: {e}")
保存文件。这个脚本尝试以读取模式("r")打开 my_script.py 文件。它使用 try...except 块来处理可能出现的错误。如果出现 PermissionError(即脚本没有读取权限),它会打印一条错误信息。它还会处理 FileNotFoundError(以防文件不存在),以及捕获其他潜在错误的通用 Exception。
现在,从终端运行脚本:
python open_file.py
你应该会看到以下输出:
Error: You do not have permission to read the file 'my_script.py'.
这是因为我们已经移除了用户组和其他用户的读取权限,而脚本是以 labex 用户身份运行的,该用户对这个文件不再有读取权限。
现在,恢复 my_script.py 文件的原始权限:
chmod 644 my_script.py
再次运行 open_file.py 脚本:
python open_file.py
你现在应该会看到 my_script.py 文件的内容被打印到控制台:
File content:
print("Hello, world!")
这展示了如何在 Python 中处理文件权限,以及如何妥善处理脚本没有足够权限访问文件的情况。通过使用 try...except 块,你可以避免脚本崩溃,并向用户提供有用的错误信息。
总结
在本次实验中,我们探究了 Linux 中的文件权限,重点关注了它们如何控制对文件和目录的访问。我们了解到,权限分为三类:所有者、用户组和其他用户,每一类都有读取、写入和执行权限。
我们创建了一个 Python 文件,并使用 ls -l 命令查看其权限,明白了该命令的输出是如何表示文件类型以及授予每类用户的权限的。这些基础知识对于理解后续步骤中如何检查文件的可读性至关重要。



