比如在某目录下包含一系列文件:
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字符串的内容的判断方法实现该需求。
在项目目录中创建问题描述的文件,用于代码测试。再创建对.py
和.c
文件加上用户可执行权限的python脚本文件String_Content_Distinguish.py
,如下图所示:
由上图的文件位置关系,在python脚本文件String_Content_Distinguish.py
访问文件夹Files
中的内容时的路径为:./Filses
,其中.
表示当前目录。
这里实现对.py
和.c
文件加上用户可执行权限的Python代码,需要附录中的知识。下面的代码哪里看不懂,可以先理解一下附录中相应的内容。
# 导入python内置的文件/目录处理模块os
import os
# 导入文件属性处理模块stat
import stat
# 使用os.listdir('./Files')方法导入Files文件中所有文件名
filenames_list = os.listdir('./Files')
for file in filenames_list:
# 只对python和c文件进行操作
if file.endswith(('.py', '.c')):
# 获得文件的权限值
file_permission = os.stat('./Files' + file).st_mode
# 使用os.chmod函数增加文件的用户可执行权限
os.chmod('./Files' + file, file_permission | stat.S_IXUSR)
执行完上面的程序后,Files文件夹下的python和c文件就编程了用户可执行文件了。
本文实现对.py
和.c
文件加上用户可执行权限的Python代码,需要以下知识储备:
str.startswith()
:判断字符串str是否以某个字符开始;str.endswith()
:判断字符串str是肉以某个字符结束。这两个函数的应用非常相似,这里只演示str.endswith()
如下图所示:
其实,我们不仅可以单独判断一个文件的开始/结尾字符情况,也可以通过元组形式判断多个文件的开始/结尾字符情况。比如,下面的代码,只有文件名字符串满足元组中的一个就返回True,如果都不满足则返回False。
file_name_2.endswith(('.py', '.c'))
file_name_2.endswith(('.cpp', '.java'))
上面的代码执行结果如下图所示:
Linux系统是一个多用户系统,为了实现系统的安全性,其对不同用户的访问权限进行了不同的设定。在Linux系统中我们可以使用ls -l
或ll
来显示文件的属性、所属的用户和组信息。比如,本文中的Files
文件内的文件信息如下图所示:
在Linux系统中文件的第一个字符(上图绿色框中的内容)表示该文件的类型:
字符 | 描述 |
---|---|
d |
目录 |
- |
文件 |
l |
链接文档(link file) |
b |
装置文件里面的可供存储的接口设备(可随机存取装置) |
c |
装置文件里面的串口设备,比如键盘、鼠标等 |
2、文件权限信息
紧接着文件类型字符的9个字符(如上图红框中的内容)表示文件的权限信息。它们三个为一组,且为rwx-
中字符的三个参数组合,其中r
表示可读(read),w
表示可写(write),x表示可执行(execute),-
表示没有权限。每组所代表权限的含义如下图所示:
Linux中对文件权限属性表示方法包括两种:
r
、w
、e
、-
表示文件的读、写、执行权限;r
、w
、e
、-
分别与数字4
、2
、1
、0
一一对应。用数字表示文件权限属性的具体方法为:每种身份(owner/group/others)各自的四种权限rwx-
对应数字的累加。比如,下面的文件权限为rw-rw-r--
:
文件的权限数字表示形式为:
因此,上图文件权限属性的数字表示方式为664
。
os模块提供了非常丰富的方法用来处理文件和目录,这里只介绍用到的os相关方法。
os.listdir()
方法用于返回指定文件夹所包含文件/文件夹的名称字符串列表。本文中的os.listdir()
使用代码如下所示:
import os
os.listdir('./Files')
其输出如下图所示:
os.stat()
方法用于在给定的路径上返回该路径文件/文件夹的信息类对象。比如我们想获取./Files
文件夹中MCS51_program.c
的信息,可使用如下代码实现:
import os
# 返回文件信息os.stat_result类
os.stat('./Files/MCS51_program.c')
# 查看os.stat函数的返回类型
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系统上表示创建时间 |
通常,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 |