python的os模块(ipython,文件,目录,权限,管理)

什么是os模块

os模块提供了多数操作系统的功能接口函数。当os模块被导入后,它会自适应于不同的操作系统平台,根据不同的平台进行相应的操作,在python编程时,经常和文件、目录打交道,这时就离不了os模块,本节内容将对os模块提供的函数进行详细的解读

一、使用脚本自动安装Python版本

要求:没有安装过Python3的系统

如果已经安装过Python3,只能选择一个不用的版本安装

1、PyCharm连接Linux

python的os模块(ipython,文件,目录,权限,管理)

python的os模块(ipython,文件,目录,权限,管理)

python的os模块(ipython,文件,目录,权限,管理)

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('=========<<Python安装成功,请进行验证!>>==========')

# 修改用户环境变量
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并执行

python的os模块(ipython,文件,目录,权限,管理)

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存在;<br>权限: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)]
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章