滚滚熊的学习笔记 2020-04-25
os模块提供了多数操作系统的功能接口函数。当os模块被导入后,它会自适应于不同的操作系统平台,根据不同的平台进行相应的操作,在python编程时,经常和文件、目录打交道,这时就离不了os模块,本节内容将对os模块提供的函数进行详细的解读
要求:没有安装过Python3的系统
如果已经安装过Python3,只能选择一个不用的版本安装
os.system()的作用:
执行shell命令 返回shell命令的返回值 命令的输出会输出到标准输出
代码演示:
os.system(‘cls‘)
下载Python版本源码 安装Python需要的依赖库 编译安装Python
1. 判断用户是不是root 2. 如果是,等待用户输入Python版本 3. 执行shell命令下载源码包 4. 安装依赖开发包 5. 编译安装Python
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‘)
[ ~]# cd /opt/ [ opt]# python test1.py
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 | 判断给出的路径是否是一个目录 |
[ ~]# pip3 install -i https://pypi.douban.com/simple/ ipython
[ ~]# ipython
python3 -m IPython --version
来查看ipython
版本,如果看到版本信息,那么就可以使用python -m IPython
命令来启动ipython
alias ipython="python3 -m IPython"
python3 -m IPython --version
这样就可以了
后文的例子以下面的目录结构为参考,工作目录为 /Users/ethan/coding/python
。
Users/ethan └── coding └── python ├── hello.py - 文件 └── web - 目录
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‘
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‘
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‘
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/‘, ‘‘)
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‘)
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
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 [] []
方法如下:
os.open(filename, flag, [,mode])
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()。
常用方法如下:
# 读取文件 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 ‘ 关闭文件成功!!
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‘) #目录必须为空
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)
执行前提,确保需要文件存在。
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‘)
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
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
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
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))
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()方法是一个简单易用的文件、目录遍历器,可以帮助我们高效的处理文件、目录方面的事情.
[ 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))
[ opt]# python3 find_cmd.py [(‘ip‘, 8), (‘cd‘, 8), (‘systemctl‘, 7), (‘ls‘, 6), (‘vim‘, 5), (‘ping‘, 3), (‘tar‘, 3), (‘vmwar