今天分享下python內置模塊中的OS模塊,os模塊是大家經常會使用到的,雖然有path這個模塊替代os, 但是大家可能還是比較熟悉os吧,那麼我自己也總結下os模塊中常用的一些方法和屬性。
怎麼開始用這個模塊呢,因為是內置的,所以不用額外安裝,直接import即可
以下簡單列幾個常用的屬性:
os.name說明:返回的是當前作業系統的名稱.
import os
>>> os.name
# windows返回結果:
nt
# linux返回結果
'posix'
說明:獲取當前系統的環境變量.
>>> os.environ
# windows返回結果
environ({'ALLUSERSPROFILE': 'C:\\ProgramData'...省略...
# linux返回結果
>>> os.environ
environ({'XDG_SESSION_ID': '2', 'HOSTNAME': 'localhost.localdomain'...省略...
說明:獲取當前作業系統路徑分隔符.
分隔符\在windows和linux都能使用。
>>> os.sep
# windows返回結果:
'\\'
# linux返回結果:
'/'
舉一個小慄子:
# windows組合一個路徑
path = "log"
with open(path + '/' + 'test.txt', 'w') as f:
f.write('hello world.')
說明:獲取當前作業系統行的分隔符.
>>> os.linesep
# windows返回結果
'\r\n'
# linux返回結果
'\n'
舉個小慄子對比下:
windows環境下使用\r行分隔符,也會換行
windows環境下使用\r\n行分隔符,相當於換2行:
2.文件和目錄的操作方法和變量用途os.getcwd()獲取當前工作目錄,即當前python腳本工作的目錄路徑os.chdir()改變當前工作目錄os.makedirs(')當前路徑創建一個目錄(可多級目錄創建)os.removedirs()遞歸刪除空目錄os.mkdir()生成單級目錄os.rmdir()刪除單級空目錄os.listdir()列出指定目錄下的所有文件和子目錄,包括隱藏文件.os.remove()刪除文件os.rename(old, new)重命名文件或文件夾os.stat()獲取文件或文件夾信息os.path.abspath()獲取文件或文件夾的絕對路徑os.path.split()獲取返回文件夾和文件二元組os.path.dirname()獲取返回的是路徑中的目錄名,看做是split後的第一個元素os.path.basename()獲取返回的是路徑中的文件名,看做是split後的第二個元素os.path.exists()判斷文件夾、文件是否存在,返回的是布爾值:true、falseos.path.isabs()判斷路徑是否是絕對路徑,返回的是布爾值:true、falseos.path.isfile()判斷是否是文件,返回的是布爾值:true、falseos.path.isdir()判斷是否是目錄,返回的是布爾值:true、falseos.path.join()將多個路徑組合返回一個路徑os.path.getsize()獲取返回的是文件內容字符串的長度os.walk()獲取遞歸目錄,返回的是一個三元組(根目錄, 目錄, 文件)os.getcwd()說明:獲取當前工作目錄.
>>> os.getcwd()
'C:\\Users\\Administrator\\AppData\\Local\\Programs\\Python\\Python37'
說明:改變當前工作目錄(切換目錄).
# 字符串前面加個r,讓裡面符號不轉義
>>> os.chdir(r"E:\01 Network\07 Program\python\test")
# 當前工作目錄已切換
>>> os.getcwd()
'E:\\01 Network\\07 Program\\python\\test'
說明:可創建多級目錄.
>>> os.makedirs("test1/test11")
說明:可遞歸刪除空目錄,一定都是==空目錄==才能刪除.
>>> os.removedirs("test1/test11")
如果不是空目錄,則會報錯:
OSError: [WinError 145] 目錄不是空的。: 'test1/test11'
說明:創建單級目錄.
>>> os.mkdir("test1")
如果創建多級不存在目錄或者已存在目錄創建,都會報錯:
>>> os.mkdir("test1/test11")
Traceback (most recent call last):
File "<pyshell#51>", line 1, in <module>
os.mkdir("test1/test11")
FileNotFoundError: [WinError 3] 系統找不到指定的路徑。: 'test1/test11'
說明:刪除單級空目錄.
>>> os.rmdir("test1")
如果目錄不為空,則會報錯:
>>> os.rmdir("test1")
Traceback (most recent call last):
File "<pyshell#85>", line 1, in <module>
os.rmdir("test1")
OSError: [WinError 145] 目錄不是空的。: 'test1'
說明:列出當前目錄下的文件夾、文件及隱藏文件.
>>> os.listdir()
['.git', '.idea', 'book', 'network', 'new_test.txt', 'test1', 'venv', '__pycache__']
說明:刪除文件.
>>> os.remove("test1/test1.txt")
如果文件不存在,則會報錯:
>>> os.remove("test1/test1.txt")
Traceback (most recent call last):
File "<pyshell#133>", line 1, in <module>
os.remove("test1/test1.txt")
FileNotFoundError: [WinError 2] 系統找不到指定的文件。: 'test1/test1.txt'
說明:重命名文件或文件夾.
>>> os.rename("test1/test1.txt", "test1/test11.txt")
>>> os.listdir("test1")
['test11', 'test11.txt', 'test12'] # 已經變成了test11.txt
說明:獲取文件或文件夾信息.
# 目錄信息
>>> os.stat("test1")
os.stat_result(st_mode=16895, st_ino=2533274791006554, st_dev=3243071515, st_nlink=1, st_uid=0, st_gid=0, st_size=0, st_atime=1630948576, st_mtime=1630948538, st_ctime=1630947394)
# 文件信息
>>> os.stat("test1/test11.txt")
os.stat_result(st_mode=33206, st_ino=562949954031987, st_dev=3243071515, st_nlink=1, st_uid=0, st_gid=0, st_size=0, st_atime=1630948524, st_mtime=1630948524, st_ctime=1630948489)
說明:獲取文件或文件夾的絕對路徑.
# 輸入文件名,可以獲取絕對路徑
>>> os.path.abspath("test1/test11.txt")
'E:\\01 Network\\07 Program\\python\\test\\test1\\test11.txt'
說明:將路徑分割成以文件夾和文件名的二元組.
# 元組第一個元素是文件夾,第二個元素是文件名
>>> os.path.split("test1/test11.txt")
('test1', 'test11.txt')
如果文件夾為空,則返回空字符串、文件夾二元組:
>>> os.path.split("test1")
('', 'test1')
說明:返回的是路徑中目錄名,可以看作是split分割後的第一個元素.
>>> os.path.dirname("test1/test11.txt")
'test1'
說明:返回的是路徑中的文件名,可以看作是split分割後的第二個元素.
>>> os.path.basename("test1/test11.txt")
'test11.txt'
說明:判斷文件夾、文件是否存在,返回的是布爾值true或ffalse.
# 判斷目錄
>>> os.path.exists("test1")
True
# 判斷文件
>>> os.path.exists("test.txt")
True
# 可以判斷帶路徑的文件
>>> os.path.exists("test1/test11.txt")
True
這個方法我們是會經常用到的,我給大家舉例一下:
# 判斷是否存在文件,如不存在則創建一個文件,並寫入數據.
if filepath = r"E:\Network\Program\python\test\test.txt"
if os.path.exists(filepath) == False:
with open(filepath, 'w') as f:
f.write('hello world.')
說明:判斷是否是絕對路徑,返回的是布爾值true或false.
# 不是絕對路徑,返回false
>>> os.path.isabs("test1")
False
# 先查看當前路徑
>>> os.getcwd()
'E:\\01 Network\\07 Program\\python\\test'
# 絕對路徑,返回True
>>> os.path.isabs(r"E:\\01 Network\\07 Program\\python\\test")
True
說明:判斷是否是文件,返回的是布爾值true或false.
>>> os.path.isfile("test1/test11.txt")
True
說明:判斷是否是目錄,返回的是布爾值true或false.
>>> os.path.isdir("test1")
True
>>> os.path.isdir("test2")
False
說明:將多個路徑組合返回一個路徑.
>>> os.path.join("test", "test1")
'test\\test1'
說明:返回的是文件內容字符串的長度
# 文件內容寫的是:hello world.
>>> os.path.getsize("test.txt")
12
說明:可以對目錄進行遞歸,返回的是一個三元組(父目錄, 子目錄, 文件)
方法walk(top, topdown=True, onerror=None, followlinks=False):
√topdown=True:默認遍歷遞歸從上到下.
√onerror=None:默認不調用任何函數.
√followlinks=False:默認不遍歷超連接;
舉個小慄子:
try:
for root, dirs, files in os.walk(path):
print('-' * 50 + "根目錄" + '-' * 50)
print(root)
print('-' * 50 + "目錄" + '-' * 50)
print(dirs)
print('-' * 50 + "文件" + '-' * 50)
print(files)
except Exception as e:
print(e)
運行結果如下所示:
舉例一個常用的例子,通過os.walk()遍歷目錄,zipfile壓縮打包:
import os
import zipfile
from datetime import datetime
path = r"E:\01 Network\07 Program\python\test\walk"
LogTime = datetime.now().strftime("%Y-%m-%d_%H-%M-%S")
try:
with zipfile.ZipFile(LogTime + ".zip", 'w') as zip:
zip_list = []
for root, dirs, files in os.walk(path):
for file in files:
zip_list.append(os.path.join(root, file))
for dir in dirs:
zip_list.append(os.path.join(root, dir))
for i in zip_list:
zip.write(i, i.replace(path, ''))
except Exception as e:
print(e)
運行後結果如下所示:
運行腳本和壓縮後的文件包都在同一個路徑。
打開壓縮包,驗證下目錄結構
今天分享python內置模塊os到此就結束了,後期也會連載其他內置模塊或第三方模塊.
如果大家需要深入研究的請參考官方文檔。
連結:os模塊
https://docs.python.org/zh-cn/3.6/library/os.html