最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python結(jié)合os模塊和shutil模塊實(shí)現(xiàn)本地文件自動(dòng)化操作

 更新時(shí)間:2026年01月04日 09:46:04   作者:杰瑞不懂代碼  
本文介紹了Python中os和shutil庫(kù)的常用文件操作方法,主要內(nèi)容包括文件路徑處理,文件復(fù)制,文件移動(dòng),刪除操作等,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解下

以下是一些os庫(kù)和shutil庫(kù)中常用的命令,可以實(shí)現(xiàn)各種便捷的文件操作,我們可以通過(guò)以下命令進(jìn)行模塊的導(dǎo)入:

import os
import shutil
import stat # 當(dāng)然有的時(shí)候我們會(huì)想過(guò)濾掉隱藏文件,就可以調(diào)用這個(gè)包

1. 文件路徑的操作

在進(jìn)行文件操作之前,我們首先需要知道文件路徑如何給,一般我們通過(guò) r 標(biāo)識(shí)符來(lái)告訴程序這個(gè)是一個(gè)文件路徑,例如:

folder_path = r"C:\Users\22330\Desktop\進(jìn)行中"

那么接下來(lái)我們就可以在這個(gè)文件夾中進(jìn)行操作了,如果我們需要組合多個(gè)路徑,就可以使用 os 模塊 path 下的 join 功能了,這個(gè)的具體作用其實(shí)就是加一個(gè) 斜杠\ 再連接路徑,這樣你就可以一直往子文件夾進(jìn)了:

folder_path = r"C:\Users\22330\Desktop\進(jìn)行中"
file_to_copy = os.path.join(folder_path, "testCopy")
print(file_to_copy) # C:\Users\22330\Desktop\進(jìn)行中\(zhòng)testCopy

那如果我們想要回到上一層文件夾,應(yīng)該如何做呢?使用 dirname 即可:

folder_path = r"C:\Users\22330\Desktop\進(jìn)行中"
parent_path = os.path.dirname(folder_path)
print(parent_path) # C:\Users\22330\Desktop

2. 復(fù)制

2.1 文件的復(fù)制

好,那么我們現(xiàn)在已經(jīng)知道如何操作路徑了,接下來(lái)我們看復(fù)制,需要注意的是,os 模塊本身確實(shí)沒(méi)有直接提供文件復(fù)制的功能,它只是有文件操作的基礎(chǔ),因此要實(shí)現(xiàn)文件的復(fù)制,我們可以使用shutil模塊,這個(gè)會(huì)更加方便:

1、這里分兩種情況,一種是你復(fù)制的時(shí)候不保留元信息,比如文件創(chuàng)建時(shí)間這些,那么就可以用copy方法:

folder_path = r"C:\Users\22330\Desktop\進(jìn)行中\(zhòng)testCopy"
shutil.copy(os.path.join(folder_path, "1.jpg"), os.path.join(folder_path, "1_copy.jpg"))

注意,我是粘貼到了同一個(gè)文件夾,這個(gè)時(shí)候時(shí)間是變化了的,代表并沒(méi)有保留初始的創(chuàng)建日期。

2、第二種就是你需要保留文件的元信息,我們就可以使用copy2方法:

folder_path = r"C:\Users\22330\Desktop\進(jìn)行中\(zhòng)testCopy"
shutil.copy2(os.path.join(folder_path, "1.jpg"), os.path.join(folder_path, "1_copy2.jpg"))

這個(gè)時(shí)候你可以觀察到,copy2 保留了原始的元信息。

2.2 文件夾的復(fù)制

在程序中,是會(huì)非常清楚區(qū)分文件夾和文件的,可以通過(guò) os.path.isdir 或者 os.path.isfile 進(jìn)行區(qū)分:

比如 folder_path 下有一個(gè)命名為 1 的文件夾,和一個(gè) 1.jpg 的圖片文件,就可以通過(guò)isdirisfile 做區(qū)分

folder_path = r"C:\Users\22330\Desktop\進(jìn)行中\(zhòng)testCopy"
print(os.path.isdir(os.path.join(folder_path, "1.jpg"))) # False
print(os.path.isfile(os.path.join(folder_path, "1.jpg"))) # True
print(os.path.isfile(os.path.join(folder_path, "1"))) # False
print(os.path.isdir(os.path.join(folder_path, "1"))) # True

在python中,如果需要復(fù)制某個(gè)文件夾,只需要使用 shutil 模塊下的 copytree 方法,如下:

folder_path = r"C:\Users\22330\Desktop\進(jìn)行中\(zhòng)testCopy"
# 兩個(gè)參數(shù),第一個(gè)是要復(fù)制的路徑,第二個(gè)是存放的路徑,同時(shí)可以進(jìn)行文件夾名字的修改
shutil.copytree(os.path.join(folder_path,"1"), os.path.join(folder_path, "1_copy"))

3. 移動(dòng)(剪切)

如果想要移動(dòng)某個(gè)文件,那么我們完全可以通過(guò) os 模塊下的rename方法實(shí)現(xiàn),下面是將1.jpg這張圖片移動(dòng)到上一級(jí)目錄中

folder_path = r"C:\Users\22330\Desktop\進(jìn)行中\(zhòng)testCopy"
os.rename(os.path.join(folder_path,"1.jpg"), os.path.join(os.path.dirname(folder_path), "1.jpg"))

那如果是想要移動(dòng)文件夾呢? 我們可以使用shutil.move 方法

sourse_folder = r"C:\Users\22330\Desktop\進(jìn)行中\(zhòng)testCopy\1"
destination_folder = r"C:\Users\22330\Desktop\進(jìn)行中\(zhòng)new_location"
# 注意這種寫法只是將 1 文件夾下所有文件移動(dòng)到 new_location 下,并不會(huì)再在 new_location 下新建一個(gè)文件夾為 1
# 如果要保留1文件夾本身,那么就是寫作 destination_folder = r"C:\Users\22330\Desktop\進(jìn)行中\(zhòng)new_location\1"
shutil.move(sourse_folder, destination_folder)  # destination_folder如果不存在,會(huì)自動(dòng)新建

或者同樣地,我們也可以使用os.rename 方法

os.rename(sourse_folder, destination_folder) # destination_folder如果不存在,會(huì)自動(dòng)新建

4. 刪除

在python中,如果需要?jiǎng)h除文件夾,我們可以用os 模塊下的rmdir方法:

del_folder = r"C:\Users\22330\Desktop\進(jìn)行中\(zhòng)testCopy\1_copy"
os.rmdir(del_folder)

但是這個(gè)方法有一個(gè)限制,就是要?jiǎng)h除的文件夾一定要是空文件夾,如果是非空文件夾,就會(huì)報(bào)錯(cuò):

所以我們有一個(gè)更加徹底的方式,就是使用shutilrmtree方法:

del_folder = r"C:\Users\22330\Desktop\進(jìn)行中\(zhòng)testCopy\1_copy"
shutil.rmtree(del_folder)

那如果我們需要?jiǎng)h除的是文件,就可以使用osremove 方法或者unlink方法:

del_file = r"C:\Users\22330\Desktop\進(jìn)行中\(zhòng)testCopy\1_copy.jpg"
os.remove(del_file)
os.unlink(del_file) # unlink和remove 的功能一樣

5. 新建

如果是想要新建一個(gè)文件夾,那可以采用os 模塊下的mkdir或者makedirs方法,只不過(guò)后者多了一個(gè)exist_ok的參數(shù),用來(lái)指定如果文件夾已經(jīng)存在,是否會(huì)報(bào)錯(cuò),比如我們文件夾已存在的時(shí)候,如果使用mkdir

mk_folder = r"C:\Users\22330\Desktop\進(jìn)行中\(zhòng)testCopy\testFolder"
os.mkdir(mk_folder)

就會(huì)報(bào)這樣的錯(cuò)誤:“[WinError 183] 當(dāng)文件已存在時(shí),無(wú)法創(chuàng)建該文件”

但是如果我們使用 makedirs,并給上 exist_ok = True,這個(gè)問(wèn)題就成功解決了:

mk_folder = r"C:\Users\22330\Desktop\進(jìn)行中\(zhòng)testCopy\testFolder"
os.makedirs(mk_folder, exist_ok=True) # 不刪除文件夾中原有的文件,且不報(bào)錯(cuò)

新建文件的話,就有很多不同的情況了,例如txt,xlsx,jpg,pptx等,這里我們以創(chuàng)建一個(gè)最簡(jiǎn)單的txt文檔為例:

mk_folder = r"C:\Users\22330\Desktop\進(jìn)行中\(zhòng)testCopy\testFolder"
txt_to_make = os.path.join(mk_folder, "test.txt")
with open(txt_to_make, "w") as f: # w 代表的是寫入狀態(tài)
    f.write("這是一個(gè)測(cè)試文件")
f.close() # 關(guān)閉文件

6. 關(guān)于隱藏文件的處理方式

這里就涉及我們上面提到的一個(gè)非常重要的包,叫做stat,我們先看一下目錄下的隱藏文件:

如果我們文件系統(tǒng)中沒(méi)有顯示隱藏文件,默認(rèn)是看不見(jiàn)的,但是程序能夠找出來(lái)

于是我們通過(guò)下面的程序打印出所有的文件,listdir 在這里是羅列所有的文件,返回一個(gè)列表,我們遍歷即可:

folder_dir = r"C:\Users\22330\Desktop\進(jìn)行中"
for item in os.listdir(folder_dir):
    print(item)

可以發(fā)現(xiàn),隱藏文件都以~開(kāi)頭,其實(shí)有的時(shí)候也以 . 開(kāi)頭,如果我們簡(jiǎn)單寫作下面的程序:

folder_dir = r"C:\Users\22330\Desktop\進(jìn)行中"
for file in os.listdir(folder_dir):
    # 如果是隱藏文件,不顯示
    if not file.startswith(".") and  not file.startswith("~"):
        print(file)

看上去確實(shí)沒(méi)問(wèn)題,但是容易誤傷友軍,比如有的文件就是以~開(kāi)頭的:

所以僅僅通過(guò)開(kāi)始字符做判斷,是不合理的,因此就引入了我們的stat:

folder_dir = r"C:\Users\22330\Desktop\進(jìn)行中"

for file in os.listdir(folder_dir):
    file_name = os.path.join(folder_dir,file)
    file_stat = os.stat(file_name) # 獲取文件屬性
    is_hidden = file_stat.st_file_attributes & stat.FILE_ATTRIBUTE_HIDDEN # 按位與 獲取隱藏狀態(tài)
    print(is_hidden) # 測(cè)試用,為2代表是隱藏文件,為0代表不是隱藏文件

    if not is_hidden:
        print(file)

7. 三個(gè)小案例

7.1 文件分類

你有一個(gè)文件夾 data(可以自己新建一個(gè)做測(cè)試),里面亂七八糟地放著 .txt 文本文件和 .xlsx 文件,需要將文件分類

import os
import shutil

folder_dir = r"C:\Users\22330\Desktop\進(jìn)行中\(zhòng)data" # 文件夾路徑
file_type = []
# 統(tǒng)計(jì)文件類型
for item in os.listdir(folder_dir):
    # 通過(guò)splitext獲取文件擴(kuò)展名,并去掉點(diǎn)號(hào)
    file_type.append(os.path.splitext(item)[1].replace(".","")) 
# 為不同文件類型創(chuàng)建文件夾
for tp in list(set(file_type)): # 通過(guò)set去重
    os.makedirs(os.path.join(folder_dir, tp), exist_ok=True)
# 移動(dòng)文件到對(duì)應(yīng)的文件夾
for item in os.listdir(folder_dir):
    if os.path.isfile(os.path.join(folder_dir, item)): # 如果是文件類型才進(jìn)行移動(dòng)
        tp = os.path.splitext(item)[1].replace(".","") # 獲取文件類型
        shutil.move(os.path.join(folder_dir, item), os.path.join(folder_dir, tp, item))
        print(f"已移動(dòng): {item}")

7.2 清理空文件夾

場(chǎng)景描述:有時(shí)候下載軟件會(huì)產(chǎn)生很多空的臨時(shí)文件夾,這個(gè)時(shí)候手動(dòng)刪除太麻煩,寫個(gè)程序自動(dòng)化處理

任務(wù)要求:

  • 遍歷某個(gè)指定目錄(只遍歷第一層即可)
  • 判斷每一個(gè)條目是否是文件夾(不是文件)
  • 如果是文件夾,并且這個(gè)文件夾是空的(里面沒(méi)有任何文件或子文件夾),就把它刪除
import os

folder_dir = r"C:\Users\22330\Desktop\進(jìn)行中\(zhòng)測(cè)試文件夾" # 文件夾路徑
for item in os.listdir(folder_dir):
    if os.path.isdir(os.path.join(folder_dir, item)): # 如果是文件類型才進(jìn)行判斷
        if len(os.listdir(os.path.join(folder_dir, item))) == 0: # 根據(jù)枚舉的長(zhǎng)度判斷是否為空文件夾
            os.rmdir(os.path.join(folder_dir, item)) # 如果是,則刪除
            print(f"已刪除空文件夾: {item}")

7.3 文件備份

場(chǎng)景描述:這是一個(gè)結(jié)合了 “隱藏文件過(guò)濾”“復(fù)制” 的綜合問(wèn)題。

任務(wù)要求

  • 定義一個(gè)源目錄 source 和一個(gè)備份目錄 backup
  • source 里的所有文件復(fù)制到 backup

關(guān)鍵難點(diǎn):

  • 不要復(fù)制隱藏文件(使用剛才學(xué)的 stat 屬性判斷)
  • 不要復(fù)制文件夾(只復(fù)制文件)
  • 復(fù)制時(shí)要保留文件的修改時(shí)間(元數(shù)據(jù))
import os
import stat
import shutil

folder_dir = r"C:\Users\22330\Desktop\進(jìn)行中" # 初始文件夾路徑
backup_dir = os.path.join(folder_dir, "backup") # 備份文件夾路徑
os.makedirs(backup_dir, exist_ok=True) # 備份文件夾

for item in os.listdir(folder_dir):
    if os.path.isfile(os.path.join(folder_dir, item)): # 排除文件夾類型
        file_stat = os.stat(os.path.join(folder_dir, item)) # 判斷是否是隱藏文件
        is_hidden = file_stat.st_file_attributes & stat.FILE_ATTRIBUTE_HIDDEN
        if not is_hidden: # 如果不是隱藏文件,保留元數(shù)據(jù)復(fù)制
            shutil.copy2(os.path.join(folder_dir, item), os.path.join(backup_dir, item))
            print(f"已備份: {item}")

掌握代碼操作文件系統(tǒng),是實(shí)現(xiàn)自動(dòng)化的第一步,希望通過(guò)上面的講解,你至少可以實(shí)現(xiàn)基本的文件系統(tǒng)操作

到此這篇關(guān)于Python結(jié)合os模塊和shutil模塊實(shí)現(xiàn)本地文件自動(dòng)化操作的文章就介紹到這了,更多相關(guān)Pytho文件自動(dòng)化操作內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 使用Pyinstaller的最新踩坑實(shí)戰(zhàn)記錄

    使用Pyinstaller的最新踩坑實(shí)戰(zhàn)記錄

    這篇文章主要給大家介紹了最近在使用Pyinstaller的踩坑實(shí)戰(zhàn)記錄,主要介紹了PYTHON2X.DLL缺失和WINDOWS2003 32BIT提示程序無(wú)效這兩個(gè)問(wèn)題的解決方法,文中給出了詳細(xì)的解決方法,需要的朋友們下面來(lái)一起看看吧。
    2017-11-11
  • 十行代碼使用Python寫一個(gè)USB病毒

    十行代碼使用Python寫一個(gè)USB病毒

    本文給大家分享一個(gè)基于十行代碼使用Python寫一個(gè)USB病毒,很簡(jiǎn)單,具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-06-06
  • python 制作手機(jī)歸屬地查詢工具(附源碼)

    python 制作手機(jī)歸屬地查詢工具(附源碼)

    這篇文章主要介紹了python 制作手機(jī)歸屬地查詢工具,幫助大家更好的理解和學(xué)習(xí)使用python,感興趣的朋友可以了解下
    2021-03-03
  • Python使用dir函數(shù)實(shí)現(xiàn)快速定位模塊詳解

    Python使用dir函數(shù)實(shí)現(xiàn)快速定位模塊詳解

    在Python的探索之旅中,dir()函數(shù)就像一把萬(wàn)能的鑰匙,能瞬間揭示對(duì)象的內(nèi)部結(jié)構(gòu),下面小編就和大家詳細(xì)介紹一下Python使用dir函數(shù)實(shí)現(xiàn)快速定位模塊的具體方法和常見(jiàn)問(wèn)題解決
    2026-06-06
  • python之?dāng)?shù)字圖像處理方式

    python之?dāng)?shù)字圖像處理方式

    這篇文章主要介紹了python之?dāng)?shù)字圖像處理方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-05-05
  • Python實(shí)現(xiàn)GIF圖倒放

    Python實(shí)現(xiàn)GIF圖倒放

    這篇文章主要介紹了Python如何實(shí)現(xiàn)GIF圖倒放,文中講解非常細(xì)致,幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下
    2020-07-07
  • 使用Python實(shí)現(xiàn)解析HTML的方法總結(jié)

    使用Python實(shí)現(xiàn)解析HTML的方法總結(jié)

    HTML(Hypertext Markup Language)是互聯(lián)網(wǎng)世界中的通用語(yǔ)言,用于構(gòu)建網(wǎng)頁(yè),本文主要為大家介紹了如何使用Python解析HTML,包括各種方法和示例代碼,希望對(duì)大家有所幫助
    2023-11-11
  • python發(fā)送郵件實(shí)例分享

    python發(fā)送郵件實(shí)例分享

    這篇文章主要為大家詳細(xì)介紹了python發(fā)送郵件實(shí)例分享,教大家如何實(shí)現(xiàn)郵件發(fā)送功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-07-07
  • python求平均數(shù)、方差、中位數(shù)的例子

    python求平均數(shù)、方差、中位數(shù)的例子

    今天小編就為大家分享一篇python求平均數(shù)、方差、中位數(shù)的例子,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-08-08
  • Django封裝交互接口代碼

    Django封裝交互接口代碼

    這篇文章主要介紹了Django封裝交互接口代碼,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-07-07

最新評(píng)論

隆回县| 潍坊市| 安顺市| 建水县| 巴楚县| 新平| 漳州市| 全南县| 东宁县| 偏关县| 深泽县| 谢通门县| 阿拉善左旗| 南和县| 永年县| 巩留县| 仁布县| 科技| 泾阳县| 保山市| 莱西市| 吉林省| 大理市| 桐庐县| 平定县| 凭祥市| 沧州市| 临潭县| 海丰县| 孙吴县| 南岸区| 江都市| 绵竹市| 林州市| 蒲城县| 乌拉特前旗| 洮南市| 永胜县| 探索| 黑河市| 恩施市|