什麼是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('=========<<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並執行
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)]