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