二十七、深入淺出Python中的os模塊

@Author: Runsen

當初學Python的時候,把一些標準庫和第三方開源庫學的七零八落,不成系統,正好趁這個機會來系統的整理一下,先從Python常用的標準庫os開始吧。

@[toc]

os

OS模塊簡單的來說它是一個Python的系統編程的操作模塊,可以處理文件和目錄這些我們日常手動需要做的 操作。 可以查看OS模塊的幫助文檔。

import os #導入os模塊  
help(os)   #查看os模塊幫助文檔,裏面詳細的模塊相關函數和使用方法

獲取當前系統

首先我們需要先導入os模塊:直接打印os.name

import os
print(os.name)

#若是Windows則輸出'nt',若是Linux/Unix,則是'posix'

獲取當前文件的絕對路徑

# 獲取當前文件的絕對路徑 桌面上的demo.py
absolute_file_path = os.path.abspath(__file__)
print(absolute_file_path)

打印結果:C:\Users\YIUYE\Desktop\demo.py

獲取當前目錄

函數os.getcwd():功能:獲取當前目錄,python的工作目錄。

cwd = os.getcwd()
print(cwd

打印結果:C:\Users\YIUYE\Desktop

判斷文件是否存在,返回值為布爾型

import os
file_path = r"C:\Users\YIUYE\Desktop\demo.py"
has_file = os.path.exists(file_path)
print("file path: [{}] is exist: {}".format(file_path, has_file))

file path: [C:\Users\YIUYE\Desktop\demo.py] is exist: True

獲取文件的名稱

import os
# 獲取文件的名稱
file_name = os.path.basename(__file__)
print(file_name)

打印結果:demo.py

文件重命名


old_file = r"C:\Users\YIUYE\Desktop\demo.py"
# 或者old_file = "C:/Users/YIUYE/Desktop/demo.py"  前面沒有r
new_file = r"C:\Users\YIUYE\Desktop\demo1.py"
# 重命名文件
os.rename(old_file, new_file)

注意點:Unix使用斜桿/ 作為路徑分隔符,而web應用最新使用在Unix系統上面,所以目前所有的網絡地址都採用 斜桿/ 作為分隔符。

Windows由於使用 斜桿/ 作為DOS命令提示符的參數標誌了,為了不混淆,所以採用 反斜杠\ 作為路徑分隔符。所以目前windows系統上的文件瀏覽器都是用 反斜杠\ 作為路徑分隔符。

隨着發展,DOS系統已經被淘汰了,命令提示符也用的很少,很多時候斜桿和反斜杠在大多數情況下可以互換,沒有影響。

記住:

  • 瀏覽器地址欄網址使用 斜桿/ ;

  • windows文件瀏覽器上使用 反斜杠\ ;

  • 出現在html url() 屬性中的路徑,指定的路徑是網絡路徑,所以必須用 斜桿/ ;

出現在普通字符串中的路徑,如果代表的是windows文件路徑,則使用 反斜杠\ 需要在前面加r;如果代表的是網絡文件路徑,則必須使用 斜桿/

具體報錯和指示如下圖。

如果是Mac沒有反斜杠\,和Linux一樣都是只有斜桿/

創建文件夾

os.makedirs創建多級目錄

# 路徑中的多個文件夾都不存在時,可以遞歸創建,code和code1文件夾本身沒有
forders_path = r"C:\Users\YIUYE\Desktop\code\code1"
os.makedirs(forders_path)

os.path.mkdir:只能創建一個文件夾, code文件夾存在,才能創建code1文件夾,如果code文件夾不存在,則會出錯。

forder_path = r"C:\Users\YIUYE\Desktop\code\code1"
os.mkdir(forder_path)

獲取文件夾下的所有文件名

forder_path = r"D:\學習資料"
# 獲取文件夾code下的所有文件名,以列表的形式返回
file_names = os.listdir(forder_path)
print(file_names)

獲取文件夾下的所有文件夾和文件(無遞歸遍歷)

print(os.scandir(r"D:\學習資料"))

打印結果:<nt.ScandirIterator object at 0x0000027EEAC6EE30>

返回的是可迭代對象,我們用for循環迭代一下遍出結果,這裡進行判斷,尋找文件,而不是文件夾

for f in os.scandir(r"D:\學習資料"):
   if not f.is_file(): #is_file判斷是否是文件
       print('yes',f)
   else:
       print('no:', f)

將path分割成路徑名和文件名

os.path.split函數返回一個路徑的目錄名和文件名

print(os.path.split(r"C:\Users\YIUYE\Desktop\demo.py"))
print(os.path.split(r"C:\Users\YIUYE\Desktop\demo.py")[0])
print(os.path.split(r"C:\Users\YIUYE\Desktop\demo.py")[1])


打印結果:('C:\\Users\\YIUYE\\Desktop', 'demo.py')
C:\Users\YIUYE\Desktop
demo.py

拼接目錄與文件名或目錄

os.path.join函數拼接目錄與文件名或目錄

print(os.path.join('I', 'am', 'Runsen'))

打印結果:I\am\Runsen

練習

創建一個函數,獲取文件夾下包含子文件夾的所有文件路徑,並且存入list輸出?

最簡單的方法使用os.walk

os.walk()用類似於深度遍歷的方式遍歷文件夾中的子文件夾以及文件。

import os
def get_Listfiles(path):
    Filelist = []
    # os.walk()用類似於深度遍歷的方式遍歷文件夾中的子文件夾以及文件。
    # 最基本的顯示方式為(root_path,[file_dirs],[files]),
    for home, dirs, files in os.walk(path):
        for file in files:
            Filelist.append(os.path.join(home, file))
            #Filelist.append(file)
    return Filelist
print(get_Listfiles(r"D:\Python"))

具體運行結果如下圖。

本文已收錄 GitHub,傳送門~ ,裏面更有大廠面試完整考點,歡迎 Star。

Tags: