什么是os模块
os模块提供了多数操作系统的功能接口函数。当os模块被导入后,它会自适应于不同的操作系统平台,根据不同的平台进行相应的操作,在python编程时,经常和文件、目录打交道,这时就离不了os模块,本节内容将对os模块提供的函数进行详细的解读
一、使用脚本自动安装Python版本
要求:没有安装过Python3的系统
如果已经安装过Python3,只能选择一个不用的版本安装
1、PyCharm连接Linux
2、os模块执行shell命令
os.system()的作用:
执行shell命令
返回shell命令的返回值
命令的输出会输出到标准输出
代码演示:
os.system('cls')
编写自动安装Python的脚本
(1)实现步骤:
下载Python版本源码
安装Python需要的依赖库
编译安装Python
(2)伪代码:
1. 判断用户是不是root
2. 如果是,等待用户输入Python版本
3. 执行shell命令下载源码包
4. 安装依赖开发包
5. 编译安装Python
(3)脚本内容如下(基于Python2):
auto_install_python.py
# coding=utf-8
import os
# 判断用户是否是root用户
if os.getuid() == 0:
pass
else:
print('当前用户不是root用户!')
SystemExit(1)
# 安装Python依赖库
cmd_module = 'yum -y install wget gcc zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel libffi-devel'
res = os.system(cmd_module)
if res != 0:
print('Python依赖库安装失败,请重新执行该脚本!')
SystemExit(1)
else:
print('Python依赖库安装成功!')
# 输入python版本,下载Python源码包到本地目录
# weget url
version = raw_input('请输入python版本:(3.6/3.8)')
if version == '3.6':
url = 'https://www.python.org/ftp/python/3.6.10/Python-3.6.10.tgz'
else:
url = 'https://www.python.org/ftp/python/3.8.2/Python-3.8.2.tgz'
cmd = 'wget ' + url
res = os.system(cmd)
if res != 0:
print('Python源码包下载失败!')
SystemExit(1)
else:
print('===============================>>>Python源码包下载成功!')
# 解压Python源码包
# tar zxvf Python-3.8.2.tgz
if version == '3.6':
package_name = 'Python-3.6.10'
else:
package_name = 'Python-3.8.1'
res = os.system('tar zxvf ' + package_name + '.tgz')
if res != 0:
print('解压失败!')
SystemExit(1)
else:
print('=============<<解压成功!>>===============')
# 必要的配置,否则出现错误:“make: *** [pybuilddir.txt] 错误1”
# export LANG=zh_CN.UTF-8
# export LANGUAGE=zhb_CN.UTF-8
cmd_export_lang = 'export LANG=zh_CN.UTF-8'
cmd_export_language = 'export LANGUAGE=zhb_CN.UTF-8'
res1 = os.system(cmd_export_lang)
res2 = os.system(cmd_export_language)
if res1 != 0 or res2 != 0:
print('配置失败,请检查解脚本后在运行!')
SystemExit(1)
# 切换Python目录
os.chdir(package_name)
os.system('./configure --prefix=/usr/local/python3')
res = os.system('make && make install')
if res != 0:
print('源码编译失败!')
SystemExit(1)
else:
print('=========<>==========')
# 修改用户环境变量
os.system('echo "export PYTHON3=/usr/local/python3" >>~/.bash_profile')
os.system('echo "export PATH=$PYTHON3/bin:$PATH" >>~/.bash_profile')
os.system("source ~/.bash_profile")
os.system('cat ~/.bash_profile')
print('用户环境变量已更改,请进行验证!')
os.system('ln -s /usr/local/python3/bin/* /usr/local/bin')
os.system('python3 --version')
3、上传到Linux并执行
Linux执行
[root@python ~]# cd /opt/
[root@python opt]# python test1.py
二、Python的os模块shell
Python 的 os 模块封装了常见的文件和目录操作,本文只列出部分常用的方法,更多的方法可以查看官方文档。
下面是部分常见的用法:
方法
说明
os.mkdir
创建目录
os.rmdir
删除目录
os.rename
重命名
os.remove
删除文件
os.getcwd
获取当前工作路径
os.walk
遍历目录
os.path.join
连接目录与文件名
os.path.split
分割文件名与目录
os.path.abspath
获取绝对路径
os.path.dirname
获取路径
os.path.basename
获取文件名或文件夹名
os.path.splitext
分离文件名与扩展名
os.path.isfile
判断给出的路径是否是一个文件
os.path.isdir
判断给出的路径是否是一个目录
1、安装ipython
[root@root ~]# pip3 install -i https://pypi.douban.com/simple/ ipython
启动ipython
[root@root ~]# ipython
如果启动不了使用:
python3 -m IPython --version
来查看ipython版本,如果看到版本信息,那么就可以使用python -m IPython 命令来启动ipython
如果要使用ipython命令来启动,可以在用户目录下的 .bash_profile中增加如下:
alias ipython="python3 -m IPython"
再次启动ipython
python3 -m IPython --version
这样就可以了
2、例子
后文的例子以下面的目录结构为参考,工作目录为 /Users/ethan/coding/python。
Users/ethan
└── coding
└── python
├── hello.py - 文件
└── web - 目录
看看例子:
(1)os.path.abspath:获取文件或目录的绝对路径
$ pwd
/Users/ethan/coding/python
$ python
>>> import os # 记得导入 os 模块
>>> os.path.abspath('hello.py')
'/Users/ethan/coding/python/hello.py'
>>> os.path.abspath('web')
'/Users/ethan/coding/python/web'
>>> os.path.abspath('.') # 当前目录的绝对路径
'/Users/ethan/coding/python'
(2)os.path.dirname:获取文件或文件夹的路径
>>> os.path.dirname('/Users/ethan/coding/python/hello.py')
'/Users/ethan/coding/python'
>>> os.path.dirname('/Users/ethan/coding/python/')
'/Users/ethan/coding/python'
>>> os.path.dirname('/Users/ethan/coding/python')
'/Users/ethan/coding'
(3)os.path.basename:获取文件名或文件夹名
>>> os.path.basename('/Users/ethan/coding/python/hello.py')
'hello.py'
>>> os.path.basename('/Users/ethan/coding/python/')
''
>>> os.path.basename('/Users/ethan/coding/python')
'python'
(4)os.path.splitext:分离文件名与扩展名
>>> os.path.splitext('/Users/ethan/coding/python/hello.py')
('/Users/ethan/coding/python/hello', '.py')
>>> os.path.splitext('/Users/ethan/coding/python')
('/Users/ethan/coding/python', '')
>>> os.path.splitext('/Users/ethan/coding/python/')
('/Users/ethan/coding/python/', '')
(5)os.path.split:分离目录与文件名
>>> os.path.split('/Users/ethan/coding/python/hello.py')
('/Users/ethan/coding/python', 'hello.py')
>>> os.path.split('/Users/ethan/coding/python/')
('/Users/ethan/coding/python', '')
>>> os.path.split('/Users/ethan/coding/python')
('/Users/ethan/coding', 'python')
(6)os.path.isfile:是否是一个文件
os.path.isdir:是否是一个目录
>>> os.path.isfile('/Users/ethan/coding/python/hello.py')
True
>>> os.path.isdir('/Users/ethan/coding/python/')
True
>>> os.path.isdir('/Users/ethan/coding/python')
True
>>> os.path.isdir('/Users/ethan/coding/python/hello.py')
False
(7)os.walk:遍历目录
os.walk 是遍历目录常用的模块,它返回一个包含 3 个元素的元祖:(dirpath, dirnames, filenames)。dirpath 是以 string 字符串形式返回该目录下所有的绝对路径;dirnames 是以列表 list 形式返回每一个绝对路径下的文件夹名字;filesnames 是以列表 list 形式返回该路径下所有文件名字。
>>> for root, dirs, files in os.walk('/Users/ethan/coding'):
... print root
... print dirs
... print files
...
/Users/ethan/coding
['python']
[]
/Users/ethan/coding/python
['web2']
['hello.py']
/Users/ethan/coding/python/web2
[]
[]
3、os模块打开文件
方法如下:
os.open(filename, flag, [,mode])
flag参数说明:
file # 要打开的文件
flags # 该参数可以是以下选项,多个使用 "|" 隔开:
os.O_RDONLY # 以只读的方式打开
os.O_WRONLY # 以只写的方式打开
os.O_RDWR # 以读写的方式打开
os.O_NONBLOCK # 打开时不阻塞
os.O_APPEND # 以追加的方式打开
os.O_CREAT # 创建并打开一个新文件
os.O_TRUNC # 打开一个文件并截断它的长度为零(必须有写权限)
os.O_EXCL # 如果指定的文件存在,返回错误
os.O_SHLOCK # 自动获取共享锁
os.O_EXLOCK # 自动获取独立锁
os.O_DIRECT # 消除或减少缓存效果
os.O_FSYNC # 同步写入
os.O_NOFOLLOW# 不追踪软链接
mode # 类似 chmod()。
4、os模块对文件进行操作
常用方法如下:
# 读取文件
os.read(fd, buffersize)
# 写入文件
os.write(fd, string)
# 文件指针操作
os.lseek(fd, pos, how)
# 关闭文件
os.close(fd)
代码演示:
文件创建和写入
import os
# 打开文件
fd = os.open("abc.txt", os.O_RDWR | os.O_CREAT)
# 写入字符串
str = "Hello Python!"
ret = os.write(fd, bytes(str, 'UTF-8'))
# 输入返回值
print("写入的位数为: ")
print(ret)
print("写入成功")
# 关闭文件
os.close(fd)
print("关闭文件成功!!")
输出结果如下:
写入的位数为:
13
写入成功
关闭文件成功!!
文件读取
import os
# 打开文件
fd = os.open("abc.txt", os.O_RDWR)
# 读取文本
ret = os.read(fd, 6)
print(ret)
# 关闭文件
os.close(fd)
print("关闭文件成功!!")
输出结果如下:
b'Hello '
关闭文件成功!!
5、os模块管理文件和目录
常用方法如下:
os方法
说明
remove(path)
删除文件
rename(old, new)
修改文件或者目录名
getcwd()
获取当前目录
listdir(path)
返回当前目录下所有文件组成的列表
mkdir(path [,mode])
创建目录
makedirs(path [,mode])
创建多级目录
rmdir(path)
删除目录(目录必须为空目录)
removedirs(path)
删除多级目录(目录必须为空目录)
代码演示:
# coding=utf-8
import os
print(os.getcwd()) # pwd
print(os.listdir()) # ls
os.rename('abc.txt','test.txt') # mv abc.txt test.txt
os.remove('read.py') # rm -f abc.txt
os.mkdir('test') # mkdir dir1
os.makedirs('demo/abc') # mkdir -p dir2/dir22
os.rmdir('test') # 目录必须为空
os.removedirs('demo') #目录必须为空
6、os模块管理文件权限
os方法
说明
access(path, mode)
判断该文件权限:F_OK存在;
权限:R_OK,W_OK,X_OK
chmod(path, mode)
修改文件权限:0o755
chown(path, uid, gid)
更改文件所有者,如果不修改可以设置为 -1
代码演示:
import os
# 测试路径是否存在:os.F_OK
res = os.access('test.txt',os.F_OK)
print(res)
# 测试当前用户对该文件是否有读的权限
res = os.access('test.txt',os.R_OK)
print(res)
# 测试当前用户对该文件是否有写的权限
res = os.access('test.txt',os.W_OK)
print(res)
# 测试当前用户对该文件是否有执行的权限
res = os.access('test.txt',os.X_OK)
print(res)
# 更改当前用户的权限
os.chmod('test.txt',0o755)
# 更改文件的所有者
os.chown('test.txt', 1001, 1002)
执行前提,确保需要文件存在。
7、os.path模块管理文件与路径
(1)拆分路径
os.path方法
说明
split
返回一个二元组,包含文件的路径和文件名
dirname
返回文件的路径
basename
返回文件名
splitext
返回一个去掉文件扩展名的部分和扩展名的二元组
代码演示:
In [10]: os.getcwd()
Out[10]: '/opt/os_demo'
In [11]: os.listdir()
Out[11]: ['os_access.py', 'test.txt']
In [12]: path = '/opt/os_demo/test.txt'
In [13]: os.path.split(path)
Out[13]: ('/opt/os_demo', 'test.txt')
In [14]: os.path.dirname(path)
Out[14]: '/opt/os_demo'
In [15]: os.path.basename(path)
Out[15]: 'test.txt'
In [16]: os.path.splitext(path)
Out[16]: ('/opt/os_demo/test', '.txt')
(2)构建路径
os.path方法
说明
expanduser
展开用户的HOME目录,如~,~oracle
abspath
得到文件或路径的绝对路径
join
根据不同的操作系统平台,使用不同的路径分隔符拼接路径
isabs
检查一个路径是不是一个绝对路径
代码演示:
In [19]: os.path.expanduser('~')
Out[19]: '/root'
In [20]: os.path.expanduser('~oracle')
Out[20]: '/home/oracle'
In [21]: os.path.expanduser('~accp')
Out[21]: '/home/accp'
In [22]: os.path.expanduser('~acp')
Out[22]: '~acp'
In [23]: os.path.abspath('.')
Out[23]: '/opt/os_demo'
In [24]: os.path.abspath('..')
Out[24]: '/opt'
In [25]: os.path.join('/opt/os_demo','test.txt')
Out[25]: '/opt/os_demo/test.txt'
In [26]: os.path.isabs('/opt/os_demo/')
Out[26]: True
In [27]: os.path.isabs('.')
Out[27]: False
(3)获取文件属性
os.path
方法
os.path.getmtime(path)
返回最近文件修改时间
os.path.getctime(path)
返回文件 path 创建时间
os.path.getsize(path)
返回文件大小,如果文件不存在就返回错误
代码演示:
In [33]: os.path.getatime(path)
Out[33]: 1587547270.7306058
In [34]: os.path.getmtime(path)
Out[34]: 1587547270.7306058
In [35]: os.path.getctime(path)
Out[35]: 1587548055.4721448
In [36]: os.path.getsize(path)
Out[36]: 0
(4)判断文件类型
os.path方法
说明
os.path.isfile(path)
判断路径是否为文件
os.path.isdir(path)
判断路径是否为目录
os.path.islink(path)
判断路径是否为链接
os.path.ismount(path)
判断路径是否为挂载点
代码演示:
In [37]: os.path.isfile(path)
Out[37]: True
In [38]: os.path.isdir(path)
Out[38]: False
In [39]: os.path.islink(path)
Out[39]: False
In [40]: os.path.ismount(path)
Out[40]: False
8、os.walk遍历目录树
os.walk0方法遍历某个目录及其子目录,对于每一个目录,walk()函数返回一 个三元组(dirpath, dirnames.filenames)。其中dirpath保存的是 当前目录,dirnames是 当前目录下的子目录列表,filenames是 当前目录下的文件列表。
# coding=utf-8
import os
for root, dirs, files in os .walk(".", topdown=False):
for name in files:
print (os.path.join(root, name))
for name in dirs:
print (os.path.join(root, name))
(1)在Linux用ipython中把/opt目录遍历一下
In [4]: for root, dirs, files in os .walk("/opt"):
...: print(root)
...: print()
...: for name in files:
...: print(os.path.join(root,name))
...: for dir in dirs:
...: print(os.path.join(root,dir))
...:
输出结果如下:
/opt
/opt/rh
/opt/rh
os.walk()方法是一个简单易用的文件、目录遍历器,可以帮助我们高效的处理文件、目录方面的事情.
(2)打印最常用的10条Linux命令
步骤:
读取~/.bash_history文件内容
将读取到的内容格式化(去掉空行)
获取指令:索引为0的元素
指令使用次数进行累加
去除重复的数据
[root@python opt]# vim find_cmd.py
# coding=utf-8
import os
from collections import Counter
count = Counter()
with open(os.path.expanduser('~/.bash_history')) as f:
for line in f:
cmd = line.strip().split()
if cmd:
count[cmd[0]] += 1
print(count.most_common(10))
输出结果如下:
[root@python opt]# python3 find_cmd.py
[('ip', 8), ('cd', 8), ('systemctl', 7), ('ls', 6), ('vim', 5), ('ping', 3), ('tar', 3), ('vmware-install.pl', 3), ('rm', 3), ('sh', 2)]