Python实例:通过os模块实现指定路径下文件权限的修改方法

Python实例:通过os模块实现指定路径下文件权限的修改方法

  • 一、问题描述
  • 二、实现代码
    • 2.1 创建代码测试文件
    • 2.2 对.py和.c文件加上用户可执行权限的实现代码
  • 附录
    • 1. str.startswith()和str.endwith()方法
    • 2. Linux系统的文件属性
    • 3. 本文用到的os方法
      • 3.1 os.listdir()方法
      • 3.2 os.stat()方法
      • 3.3 os.chmod()方法与stat文件权限常量模块

一、问题描述

比如在某目录下包含一系列文件:

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实例:通过os模块实现指定路径下文件权限的修改方法_第1张图片

由上图的文件位置关系,在python脚本文件String_Content_Distinguish.py访问文件夹Files中的内容时的路径为:./Filses,其中.表示当前目录。

2.2 对.py和.c文件加上用户可执行权限的实现代码

这里实现对.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)

Python实例:通过os模块实现指定路径下文件权限的修改方法_第2张图片
执行完上面的程序后,Files文件夹下的python和c文件就编程了用户可执行文件了。

附录

本文实现对.py.c文件加上用户可执行权限的Python代码,需要以下知识储备:

1. str.startswith()和str.endwith()方法

  • (1)str.startswith():判断字符串str是否以某个字符开始;
  • (2)str.endswith():判断字符串str是肉以某个字符结束。

这两个函数的应用非常相似,这里只演示str.endswith()如下图所示:

Python实例:通过os模块实现指定路径下文件权限的修改方法_第3张图片

其实,我们不仅可以单独判断一个文件的开始/结尾字符情况,也可以通过元组形式判断多个文件的开始/结尾字符情况。比如,下面的代码,只有文件名字符串满足元组中的一个就返回True,如果都不满足则返回False。

file_name_2.endswith(('.py', '.c'))
file_name_2.endswith(('.cpp', '.java'))

上面的代码执行结果如下图所示:

在这里插入图片描述

2. Linux系统的文件属性

Linux系统是一个多用户系统,为了实现系统的安全性,其对不同用户的访问权限进行了不同的设定。在Linux系统中我们可以使用ls -lll来显示文件的属性、所属的用户和组信息。比如,本文中的Files文件内的文件信息如下图所示:

Python实例:通过os模块实现指定路径下文件权限的修改方法_第4张图片
1、文件类型

在Linux系统中文件的第一个字符(上图绿色框中的内容)表示该文件的类型:

字符 描述
d 目录
- 文件
l 链接文档(link file)
b 装置文件里面的可供存储的接口设备(可随机存取装置)
c 装置文件里面的串口设备,比如键盘、鼠标等

2、文件权限信息
紧接着文件类型字符的9个字符(如上图红框中的内容)表示文件的权限信息。它们三个为一组,且为rwx-中字符的三个参数组合,其中r表示可读(read),w表示可写(write),x表示可执行(execute),-表示没有权限。每组所代表权限的含义如下图所示:

Python实例:通过os模块实现指定路径下文件权限的修改方法_第5张图片

  • 前3位表示:所有者(Owner)权限,也称为用户权限;
  • 中间3位表示:用户组(Group)权限;
  • 后面3为表示:其他用户(Others)权限。

Linux中对文件权限属性表示方法包括两种:

  • (1)符号表示:比如用上面介绍的rwe-表示文件的读、写、执行权限;
  • (2)数字表示:我们可以将rwe-分别与数字4210一一对应。

用数字表示文件权限属性的具体方法为:每种身份(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_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)

输入结果如下图所示:

Python实例:通过os模块实现指定路径下文件权限的修改方法_第6张图片

由上图可以看出,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

你可能感兴趣的:(#,Python语言,python,os,文件权限)