Python实例:通过os模块实现指定路径下文件权限的修改方法
一、问题描述
比如在某目录下包含一系列文件:
MCS51_program.c
algorithm.c
pandas_example.py
numpy_example.py
web_development.java
LINUX_CORE_program.sh
GUI_development.cpp
RISC-V.asm
embedded.rs
...
需求描述:实现给该目录下所有.py 和.c 文件加上用户可执行权限的。这里,我们就要应用python字符串的内容的判断方法实现该需求。
二、实现代码
2.1 创建代码测试文件
在项目目录中创建问题描述的文件,用于代码测试。再创建对.py 和.c 文件加上用户可执行权限的python脚本文件String_Content_Distinguish.py ,如下图所示:
由上图的文件位置关系,在python脚本文件String_Content_Distinguish.py 访问文件夹Files 中的内容时的路径为:./Filses ,其中. 表示当前目录。
2.2 对.py和.c文件加上用户可执行权限的实现代码
这里实现对.py 和.c 文件加上用户可执行权限的Python代码,需要附录中的知识。下面的代码哪里看不懂,可以先理解一下附录中相应的内容。
import os
import stat
filenames_list = os.listdir('./Files')
for file in filenames_list:
if file.endswith(('.py', '.c')):
file_permission = os.stat('./Files' + file).st_mode
os.chmod('./Files' + file, file_permission | stat.S_IXUSR)
执行完上面的程序后,Files文件夹下的python和c文件就编程了用户可执行文件了。
附录
本文实现对.py 和.c 文件加上用户可执行权限的Python代码,需要以下知识储备:
1. str.startswith()和str.endwith()方法
- (1)
str.startswith() :判断字符串str是否以某个字符开始; - (2)
str.endswith() :判断字符串str是肉以某个字符结束。
这两个函数的应用非常相似,这里只演示str.endswith() 如下图所示:
其实,我们不仅可以单独判断一个文件的开始/结尾字符情况,也可以通过元组形式判断多个文件的开始/结尾字符情况。比如,下面的代码,只有文件名字符串满足元组中的一个就返回True,如果都不满足则返回False。
file_name_2.endswith(('.py', '.c'))
file_name_2.endswith(('.cpp', '.java'))
上面的代码执行结果如下图所示:
2. Linux系统的文件属性
Linux系统是一个多用户系统,为了实现系统的安全性,其对不同用户的访问权限进行了不同的设定。在Linux系统中我们可以使用ls -l 或ll 来显示文件的属性、所属的用户和组信息。比如,本文中的Files 文件内的文件信息如下图所示:
1、文件类型
在Linux系统中文件的第一个字符(上图绿色框中的内容)表示该文件的类型:
字符 | 描述 |
---|
d | 目录 | - | 文件 | l | 链接文档(link file) | b | 装置文件里面的可供存储的接口设备(可随机存取装置) | c | 装置文件里面的串口设备,比如键盘、鼠标等 |
2、文件权限信息 紧接着文件类型字符的9个字符(如上图红框中的内容)表示文件的权限信息。它们三个为一组,且为rwx- 中字符的三个参数组合,其中r 表示可读(read),w 表示可写(write),x表示可执行(execute),- 表示没有权限。每组所代表权限的含义如下图所示:
- 前3位表示:所有者(Owner)权限,也称为用户权限;
- 中间3位表示:用户组(Group)权限;
- 后面3为表示:其他用户(Others)权限。
Linux中对文件权限属性表示方法包括两种:
- (1)符号表示:比如用上面介绍的
r 、w 、e 、- 表示文件的读、写、执行权限; - (2)数字表示:我们可以将
r 、w 、e 、- 分别与数字4 、2 、1 、0 一一对应。
用数字表示文件权限属性的具体方法为:每种身份(owner/group/others)各自的四种权限rwx- 对应数字的累加。比如,下面的文件权限为rw-rw-r-- :
文件的权限数字表示形式为:
- owner = rw- = 4 + 2 + 0 = 6
- group = rw- = 4 + 2 + 0 = 6
- others = r-- = 4 + 0 + 0 = 4
因此,上图文件权限属性的数字表示方式为664 。
3. 本文用到的os方法
os模块提供了非常丰富的方法用来处理文件和目录,这里只介绍用到的os相关方法。
3.1 os.listdir()方法
os.listdir() 方法用于返回指定文件夹所包含文件/文件夹的名称字符串列表。本文中的os.listdir() 使用代码如下所示:
import os
os.listdir('./Files')
其输出如下图所示:
3.2 os.stat()方法
os.stat() 方法用于在给定的路径上返回该路径文件/文件夹的信息类对象。比如我们想获取./Files 文件夹中MCS51_program.c 的信息,可使用如下代码实现:
import os
os.stat('./Files/MCS51_program.c')
type(os.stat('./Files/MCS51_program.c'))
oct(os.stat('./Files/MCS51_program.c').st_mode)
输入结果如下图所示:
由上图可以看出,os.stat() 方法的返回为os.stat_result 文件信息类,且包含很多属性。其中,本文用到的类属性就是st_mode :文件的权限数值结果,如果将其以八进制显示,这样就与Linux系统下用户、用户组、其他用户的权限数值信息对应上了。
os.stat() 方法的os.stat_result 文件信息类返回值所包含的属性名及其含义如下表所示:
类属性 | 描述 |
---|
st_mode | 节点(文件/文件夹)的权限数值信息 | st_ino | 节点(文件/文件夹)的编号 | st_dev | 节点(文件/文件夹)驻留的设备 | st_nlink | 节点(文件/文件夹)的链接数 | st_uid | 节点(文件/文件夹)的所有者的用户ID | st_gid | 节点(文件/文件夹)的组ID | st_size | 普通文件以字节为单位的大小 | st_atime | 上次访问的时间 | st_mtime | 最后一次修改的时间 | st_ctime | Unix中表示最新的元数据更改时间,Windows系统上表示创建时间 |
3.3 os.chmod()方法与stat文件权限常量模块
通常,os.chmod() 方法与stat 文件权限常量结合使用,通过布尔操作,能够非常方便的修改文件/目录的文件权限。本文就是通过或| 操作,在原来的文件权限上添加了用户的可执行的权限。 1、os.chmod()方法 os.chmod() 方法用于更改文件/目录的权限,其语法格式如下所示:
os.chmod(path, mode)
path :表示字符串格式的文件/目录的路径。mode :表示文件的权限模式,对模式的修改通常结合stat 文件权限常量结合使用。
2、stat文件权限常量模块
stat 文件权限常量模块包括的文件权限常量及其含义如下表所示(注意,权限数值是以八进制0o 表示):
常量 | 描述 |
---|
stat.S_IXOTH | 其他用户(OTH, Other)具有可执行(X, execute)权限,数值为0o001 | stat.S_IWOTH | 其他用户具有写(W, Write)权限,数值为0o002 | stat.S_IROTH | 其他用户具有读(R, Read)权限,数值为0o004 | stat.S_IRWXO | 其他用户具有全部权限(权限掩码),数值为0o007 | stat.S_IXGRP | 组用户(GRP, Group)具有可执行(X, execute)权限,数值为0o010 | stat.S_IWGRP | 组用户具有写(W, Write)权限,数值为0o020 | stat.S_IRGRP | 组用户具有读(R, Read)权限,数值为0o040 | stat.S_IRWXG | 组用户具有全部权限(权限掩码),数值为0o070 | stat.S_IXUSR | 拥有者(USR, User)具有可执行(X, execute)权限,数值为0o100 | stat.S_IWUSR | 拥有者具有写(W, Write)权限,数值为0o200 | stat.S_IRUSR | 拥有者具有读(R, Read)权限,数值为0o400 | stat.S_IRWXU | 拥有者具有全部权限(权限掩码),数值为0o700 |
|