1. 程式人生 > >20181210(os,os.path,subprocess,configparser,shutil)

20181210(os,os.path,subprocess,configparser,shutil)

 

1、os模組

os表示作業系統,該模組主要處理與作業系統相關的操作。最常用的是檔案操作:開啟,讀取,刪除,複製,重新命名。

重點掌握增刪改查的函式操作。

import os
# 獲取當前執行檔案所在資料夾路徑
print(os.getcwd())
輸出結果:
C:\Users\wangt\PycharmProjects\new\20181210
   
# 修改當前的工作目錄(將當前檔案挪到目標資料夾中)
os.chdir("想要切換到的目標資料夾") #沒有返回值

# 獲取當前目錄的字串表現方式
print(os.curdir)  #(輸出結果為.)
# 獲取當前目錄的父級的字串表現方式
print(os.pardir)  #(輸出結果為..)

# 建立多級目錄,可以自動建立中間的目錄
os.makedirs("a/b/c")
# 輸出結果為在當前執行資料夾下新建了三級資料夾

# 只能建立單級目錄 會把c1和c2當成已存在的路徑
os.mkdir("c1/c2/b3")
# 輸出結果為在當前資料夾下的c1/c2資料夾下建立了b3資料夾

# 刪除一個資料夾,必須保證資料夾是空的,才能刪除
os.rmdir("資料夾名稱")  # 同級目錄直接輸資料夾名稱,或者輸入資料夾路徑

# 如果要刪除一個不為空的資料夾。思路是先遍歷這個資料夾中的所有檔案和資料夾,先把裡面的內容全部刪除,最後再刪除資料夾
# 注意遍歷刪除檔案時,listdir得到的是檔名稱,需要手動拼接完整路徑
path = r"C:\Users\wangt\PycharmProjects\new\20181210\aa" #想要刪除的資料夾路徑
for f in os.listdir("aa"):
   f_path=path+"\\"+f  #兩個\\,第一個表示轉義,相當於拼接出檔案的路徑
   os.remove(f_path)
os.rmdir("aa")
結果是資料夾aa都被刪除(aa資料夾與當前執行檔案同級)

# 獲取檔案屬性
print(os.stat("test.py"))

# 獲取當前的路徑分隔符,當程式需要跨平臺時,路徑不能直接寫死,要從os中獲取。
print(os.sep)
windows下輸出結果為:\

# 獲取當前平臺使用的換行符
print(os.linesep)

# 執行系統命令
os.system()
例如:os.system("dir")

# 顯示當前作業系統的環境變數 (path是pycharm下的環境變數)
print(os.environ)

 

2、os下path小模組的使用
    path是os下的一個小模組,path意為路徑,該模組用於處理路徑相關問題,通常與os模組一起使用。
之所以用這個模組,是因為python是跨平臺的,各平臺的路徑書寫方式不同,所以將所有與路徑相關的都進行了封裝,使用了path後,程式在跨平臺時就不會因為路徑問題報錯了

 

# 返回絕對路徑,其實就是把當前執行檔案所在的資料夾與使用者給的引數進行拼接
print(os.path.abspath("test.py"))
輸出結果:
C:\Users\wangt\PycharmProjects\new\20181210\test.py

# 將路徑分割為資料夾和檔名
print(os.path.split(r"C:\Users\wangt\PycharmProjects\new\20181210\test0.py"))
輸出結果: #一個元組,兩個元素
('C:\\Users\\wangt\\PycharmProjects\\new\\20181210', 'test0.py')  #雙反斜槓是為了轉義

# 獲取路徑中的檔名稱
print(os.path.basename(r"C:\Users\wangt\PycharmProjects\new\20181210\test0.py"))
輸出結果:
test0.py

# 獲取路徑中的資料夾路徑
print(os.path.dirname(r"C:\Users\wangt\PycharmProjects\new\20181210\test0.py"))
輸出結果:
C:\Users\wangt\PycharmProjects\new\20181210

# 判斷一個檔案路徑是否存在
print(os.path.exists(r"C:\Users\wangt\PycharmProjects\new\20181210\test0.py"))
輸出結果為True或者False


# 判斷檔案是否是絕對路徑,判斷依據:第一個字元是不是路徑分隔符,如果是則表示是絕對路徑
print(os.path.isabs(r"C:\Users\wangt\PycharmProjects\new\20181219"))
輸出結果為True或者False

# 判斷路徑是否是一個檔案
print(os.path.isfile(r"C:\Users\wangt\PycharmProjects\new\20181210\test0.py"))  #輸出結果為True或者False

# 判斷路徑是否是一個資料夾
print(os.path.isdir(r"C:\Users\wangt\PycharmProjects\new\20181210)) #輸出結果為True或者False

# 以當前平臺的路徑分隔符來拼接路徑,如果有多個碟符,取最後一個。
print(os.path.join("a","b"))
print(os.path.join("A:\\","B:\\","b"))  #A會被忽略
輸出結果為:
a\b
B:\b

 

import os
# 獲取專案的根目錄
BASE_DIR = os.path.dirname(os.path.dirname(__file__))
# 拼接userData的完整路徑,為了跨平臺,使用os.path來處理路徑
USERDATA_PATH = os.path.join(BASE_DIR,"DB","userData")


import sys,os
# 新增環境變數
sys.path.append(os.path.dirname(os.path.dirname(__file__)))
# 匯入配置檔案
from conf import settings
# 訪問配置檔案中的使用者資料路徑
print(settings.USERDATA_PATH)

 

# 檔案或者目錄的最後存取時間
print(os.path.getatime(path))
# 檔案或者目錄的最後修改時間
print(os.path.getmtime(path))
# 返回檔案大小
print(os.path.getsize(path))  # 輸出結果單位為位元組

# 返回規範化路徑,大寫變成小寫,斜槓變成當前平臺對應的斜槓等
print(os.path.normcase(r"C:\Users\wangt\PycharmProjects\new\20181210\test0.py"))

# 斜槓轉換成當前系統對應的斜槓,同時還可以向上返回,得到上級路徑
print(os.path.normpath(r"C:\Users\wangt\PycharmProjects\new\20181210\..")) #單次最多返回兩級
print(os.path.normpath(r"C:\Users\wangt\PycharmProjects\new\20181210\..\..")) #向上四級

 

3、subprocess

 

subprocess稱之為子程序,程序就是一個正在執行的程式,子程序是由另一個程式啟動的程式。

使用子程序的目的:當程式自身無法處理某項任務時,需要通過另一個程式來處理,也就是子程序。

 

os.system在執行系統指令時,也可以命令作業系統啟動某個程式。
os.system在執行時,直接把結果輸出到了控制檯,無法獲取執行結果
subprocess不僅可以啟動子程序,還能與子程序進行資料互動

當需要在python中啟動一個子程式,並且可以進行資料互動時就是用subprocess。如果不需要資料互動,就使用os.system

 

import subprocess

dir表示要執行的命令
shell表示dir是一個命令
stdout指定輸出管道:管道的作用就是把資料傳輸到另一個程序中,本質上就是讀寫同一個檔案
   
# 啟動一個dir子程序,並將結果輸出到指定管道
p = subprocess.Popen("dir",shell=True,stdout=subprocess.PIPE)
print(p.stdout.read())   #stdout輸出


# 啟動一個tasklist子程序,指定輸出結果到管道中
p1=subprocess.Popen("tasklist",shell=True,stdout=subprocess.PIPE)
# 啟動一個findstr子程序,將p1程序的結果作為p2程序輸入
p2=subprocess.Popen("findstr cmd",  #要執行的指令
                   shell=True,  #第一個引數是否是一個指令,這個預設是False。
                   stdin=p1.stdout, #指定輸入管道
                   stdout=subprocess.PIPE,  #指定輸出管道
                   stderr=subprocess.PIPE)  #stderr 表示錯誤管道,當程序執行出錯時,可以在錯誤管道中獲取結果。
# 讀取p2程序的結果
print(p2.stdout.read())
print(p2.stderr.read().decode("GBK"))  #國內win預設GBK

 

4、configparser 配置解析檔案

作為配置資訊的資料,要滿足兩個條件:

1、資料的值是不固定的

2、可以由使用者來指定

讀取配置資訊分為兩步:

1、讀取某個配置檔案

2、呼叫get()函式

 

 

標準配置檔案應為configparser資料夾下的.cfg檔案。

一份檔案可以有多個section分割槽,分割槽之間不能重名。

同一個分割槽下,option也不能重名。

[mysql]   # 這是分割槽,中括號內寫分割槽名字,分割槽名不能重複
username = jack  # 這是一個option(選項)
password = 123   # 所有option左右兩端全都會被預設設定成字串。
lock = true

[django]  #這也是分割槽

 

import configparser

# 建立一個配置檔案解析器
cfg = configparser.ConfigParser()
# 讀取名為test.cfg的配置檔案
cfg.read("test.cfg",encoding="UTF-8")
# 獲取分割槽
print(cfg.sections())
輸出結果為:
['mysql', 'django']  # 得到列表

# 獲取某個分割槽下的某個選項 第一個引數分割槽名 第二個選項名稱
username = cfg.get("mysql","username")
print(username)
print(type(username))
輸出結果:
jack
<class 'str'>


password = cfg.get("mysql","password")
print(password)
print(type(password))
print(int(password))
輸出結果為:
123
<class 'str'>
123  # 預設都是字串,想計算就要先修改資料型別

# 改換布林值
lock = cfg.getboolean("mysql","lock")
print(type(lock))
print(lock)
輸出結果為:
<class 'bool'>
True

# 以下三個函式是幫你封裝了 型別轉換
cfg.getfloat()  # 轉換成浮點數
cfg.getint()   #轉換成整數
cfg.getboolean()  #轉換成布林值

 

5、configparser 增刪改操作

作為配置檔案 最常用的操作就是讀取,很少會做修改 總結: read讀取配置檔案 add_section 新增分割槽 set 如果沒有這個選項則新增 remove_section 刪除分割槽 remove_option 刪除選項

import configparser

# 修改
cfg = configparser.ConfigParser()
cfg.read("test.cfg",encoding="utf-8")
# 將mysql分割槽下的lock改為True
cfg.set("mysql","lock","true")  # 此處布林值大小無所謂
with open("test.cfg","wt",encoding="UTF-8") as f:
   cfg.write(f)
   
   
# 新增新的分割槽
cfg.add_section("新分割槽")

# 新增新的選項 port 值為3306
cfg.set("mysql","port","3306")
with open("test.cfg","wt",encoding="UTF-8") as f:
   cfg.write(f)
   
   
# 刪除
cfg = configparser.ConfigParser()
cfg.read("test.cfg",encoding="utf-8")
# 刪除分割槽
cfg.remove_section("新分割槽")
# 刪除某個分割槽的選項
cfg.remove_option("mysql","port")


# 判斷是否存在某個分割槽
print(cfg.has_section("mysql"))  # 返回值為布林值
# 判斷是否存在某個選項
print(cfg.has_option("mysql","username"))  # 返回值為布林值

 

6、shutil 增刪改操作

該模組提供比os模組更加豐富的檔案操作功能,如壓縮、解壓縮、獲取檔案資訊等。

    shutil.copyfileobj   拷貝檔案 提供兩個檔案物件 長度表示緩衝區大小
   shutil.copyfile(src, dst) 拷貝檔案 提供兩個檔案路徑
   shutil.copymode()  拷貝檔案許可權 提供兩個檔案路徑
   shutil.copystat(src, dst) 拷貝檔案狀態資訊 最後訪問 最後修改 許可權 提供兩個檔案路徑
   shutil.copy(src, dst) 拷貝檔案和許可權   提供兩個檔案路徑
   shutil.copy2(src, dst) 拷貝檔案和狀態資訊 提供兩個檔案路徑
   
   
   shutil.ignore_patterns("mp3","*.py") #名字是mp3或者字尾名為.py的就不復制
   shutil.copytree(src, dst, symlinks=False, ignore=None)  # 拷貝目錄(兩句聯合使用)
   
   
   
   symlinks預設False將軟連線拷貝為硬連結  否則拷貝為軟連線
   shutil.rmtree 刪除目錄 可以設定忽略檔案
   shutil.move(src, dst)   移動目錄和檔案

壓縮與解壓縮:

import shutil
# 壓縮檔案只支援zip和tar

#壓縮, 檔名 格式 需要壓縮的檔案所在資料夾
shutil.make_archive("壓縮測試","zip",r"/Users/jerry/PycharmProjects/備課/常用模組五期")   #壓縮後的檔案放置在與被壓縮檔案相同的資料夾中

#解壓縮 #壓縮, 檔名 解壓後的檔案存放目錄
shutil.unpack_archive("壓縮測試.zip",  #解壓檔名
                     r"/Users/jerry/PycharmProjects/備課/常用模組五期"
                    r"zip")