Python 自動化操作文件和文件夾

投稿作者:Huang supreme
編輯整理:JackTian
微信公衆號:傑哥的IT之旅(ID:Jake_Internet)

投稿作者文章導讀:

1、“羅永浩抖音首秀”銷售數據的可視化大屏是怎麼做出來的呢?
2、利用 Python 進行多 Sheet 表合併、多工作簿合併、一表按列拆分

1、輸出目錄下所有文件及文件夾

1)os.getcwd():獲取當前python程序的運行路徑
import os
os.getcwd()

結果如下:

2)路徑中斜槓(/)和反斜槓()的說明
3)os.path.join():自動連接路徑(不同的操作系統,連接符不同)
os.path.join("My Project","Demo")
"C:\\" + os.path.join("My Project","Demo")

結果如下:

4)絕對路徑和相對路徑
5)os.listdir()與os.isdir()

os.listdir():列出當前程序文件夾下的所有文件和文件夾;
os.scandir():os.listdir()的一種更好的替代方法,返回的是一個迭代器。注意:我們可以採用循環迭代其中的每一個元素,os.scandir()有兩個特殊的屬性和一個方法,我們在下面的例子中,進行演示。

os.listdir()
os.scandir()
for item in os.scandir():
    print(item.name,item.is_dir(),"\n\t",item.path)

結果如下:


其實,os.listdir()或者os.scandir()其實可以傳入一個路徑,然後獲取指定路徑下的文件或者文件夾。
os.listdir("G:\\6Tipdm\\Python集訓營_情感分析")
for item in os.scandir("G:\\6Tipdm\\Python集訓營_情感分析"):
    print(item.name,item.is_dir(),"\n")

結果如下:

2、遍歷、搜索文件及查詢文件信息

1)找出文件夾裏的文件夾裏的“文件”或“文件夾”
① os.walk(路徑):傳入一個路徑,幫助我們將文件夾裏的文件夾裏的文件夾裏的文件都找出來。
for dirpath, dirnames, files in os.walk("./"):
    print(f"發現文件夾\t{dirpath}")
    print(files)
-----------------------------------------------
 for dirpath, dirnames, files in os.walk("./"):
    print(f"發現文件夾\t{dirpath}")
    print(dirnames) 

"""
dirpath是文件夾路徑
dirnames是dirpath這個文件夾下的子文件夾列表
files是dirpath這個文件夾裏的文件列表
"""

結果如下:

2)搜索、匹配文件名稱及文件信息查看
① 方法一:startswith()和endswith()
  • 字符串A.startswith(字符串B):字符串A是否以字符串B開頭;

  • 字符串A.endswith(字符串B):字符串A是否以字符串B結尾;

"abc.txt".startswith("abc")
"abc.txt".endswith(".txt")
------------------------------------------------------
list1 = ["a.txt", "b.py", "c.xlsx", "d.txt", "e.txt"]
for item in list1:
    if  item.endswith(".txt"):
        print(item)

結果如下:

② 方法二:glob模塊

該模塊可以採取類似於“正則”的方式,進行文件匹配,用起來很方便。


代碼如下:
for i in glob.glob("*.txt"):
    print(i)
---------------------------
for i in glob.glob("a*.txt"):
    print(i)
---------------------------
for i in glob.glob("a?.txt"):
    print(i)
---------------------------
for i in glob.glob("a??.txt"):
    print(i)

結果如下:


特別的:glob()方法中還有一個參數recursive = True,能夠將所有深層文件夾裏面,符合條件的文件給你找出來。
# 注意:一個*和兩個*的區別
glob.glob("*/*.txt",recursive=True)
glob.glob("**/*.txt",recursive=True)

結果如下:

③ os.scandir()返回的文件都可以利用stat()方法,進行查看

代碼如下:
for file in os.scandir():
    print(file.name, file.stat(), "\n")

結果如下:


接着,我們獲取上述幾個常用屬性看看。
import time 

for file in os.scandir():
    print(file.name, file.stat().st_size, time.ctime(file.stat().st_ctime), "\n")

結果如下:

3、批量創建、複製、移動、刪除、重命名文件及文件夾

1)創建文件夾
os.mkdir("新文件夾名稱"):創建單層文件夾;
os.makedirs("第一層/第二層/第三層"):創建多層文件夾;
list1 = ["文件夾{}".format(i) for i in range(5)]
for i in list1:
    os.mkdir(i)

結果如下:

問題:當某個文件夾已經存在的時候,運行此代碼,會報錯。此時可以添加一個判斷條件

(os.path.exists("新文件夾名稱"))。
if not os.path.exists("傻逼"):
    os.mkdir("傻逼")

結果如下:

2)複製文件及文件夾(shutil模塊兒)
  • shutil.copy("要複製的文件", "要複製到的位置"):複製文件;

  • shutil.copytree("要複製的文件夾", "要複製到的新文件夾的位置"):複製文件夾;

① 複製文件
  • shutil.copy("要複製的文件", "要複製到的位置");

操作如下:

import shutil
# 將aba.txt複製一份到project文件夾中。
shutil.copy("aba.txt", "./project")
# 將aba.txt複製一份到project文件夾中,並重新命名爲“新名字.txt”。
shutil.copy("aba.txt", "./project/新名字.txt")

結果如下:

② 複製文件夾:相當於重命名文件夾
  • shutil.copytree("要複製的文件夾", "要複製到的新文件夾的位置");

  • 注意:將某個文件夾移動到另外一個文件夾(該文件夾必須是新文件夾),不能是已經存在了的文件夾;

操作如下:

import shutil
shutil.copytree("project", "./qq")

結果如下:

3)移動文件或文件夾
  • shutil.move("要移動的文件或文件夾","要移動到的位置"):移動文件/文件夾;

  • 文件夾或者文件被移動後,原始文件就沒有了;

① 移動文件
  • shutil.move("要移動的文件","要移動到的位置")

操作如下:

import shutil
# 將aba.txt移動到“傻逼”文件夾下
shutil.move("aba.txt","./傻逼/")
# # 將test.txt移動到“傻逼”文件夾下,並重新命名爲test1.txt
shutil.move("test.txt","./傻逼/test1.txt")

結果如下:

② 移動文件夾
  • shutil.move("要移動的文件夾","要移動到的位置")

操作如下:

import shutil
# 將“第一層”文件夾移動到“傻逼”文件夾下
shutil.move("第一層","./傻逼/")
# 將“qq”文件夾移動到“傻逼”文件夾下,並重新命名爲“哈哈”文件夾
shutil.move("qq","./傻逼/哈哈")

結果如下:

4)重命名文件或文件夾
  • os.rename("文件/文件夾","新文件名/新文件夾名")

操作如下:

import os
# 將test1.xlsx重命名爲“my.xlsx”
os.rename("test1.xlsx","my.xlsx")
# 將“傻逼”文件夾重命名爲“傻子”文件夾
os.rename("傻逼","傻子")

結果如下:

5)刪除文件或文件夾
① 刪除文件
  • os.remove("要刪除的文件")

  • 注意:這裏說的只是刪除文件,而不能是文件夾;

操作如下:

import os 
# 刪除“my.xlsx”文件
os.remove("my.xlsx")

結果如下:

② 刪除文件夾
  • shutil.rmtree("要刪除的文件夾")

操作如下:

import shutil
# 刪除“文件夾0”這個文件夾
shutil.rmtree("文件夾0")

結果如下:

4、創建和解壓壓縮包

  • 注意:這裏所說的壓縮包,指的是“.zip”格式的壓縮包;

1)讀取壓縮包裏的文件
import zipfile

with zipfile.ZipFile("python辦公自動化.zip", "r") as zipobj:
    print(zipobj.namelist())
-----------------------------------------------------------
# 注意:有時候需要寫成filename.encode("cp437").decode("gbk")
with zipfile.ZipFile("python辦公自動化.zip", "r") as zipobj:
    for filename in zipobj.namelist():
        print(filename.encode("gbk").decode("gbk"))

結果如下:

2)讀取壓縮包裏面的文件信息
import zipfile

with zipfile.ZipFile(r"G:\tableau書籍\Tableau文件.zip", "r") as zipobj:
    for filename in zipobj.namelist():
        info = zipobj.getinfo(filename)
        new_filename = filename.encode("cp437").decode("gbk")
        print(new_filename, info.file_size/1024/1024, info.compress_size/1024/1024)

結果如下:

3)解壓壓縮包
  • extract("壓縮包內要解壓的文件名","解壓到哪個位置"):將壓縮包內單個文件解壓出來;

  • extractall("解壓到哪個位置"):將壓縮包內所有文件解壓出來;

① 解壓單個文件
  • extract("壓縮包內要解壓的文件名","解壓到哪個位置")

import zipfile
# 將該壓縮包中的“a.txt”文件,單獨解壓到“傻子”文件夾下
with zipfile.ZipFile(r"G:\6Tipdm\7python辦公自動化\python辦公自動化.zip", "r") as zipobj:
    zipobj.extract("a.txt","./傻子/")

結果如下:

② 解壓整個文件
  • extractall("解壓到哪個位置")

import zipfile
# 將該壓縮包整個解壓到“文件夾1”文件夾下
with zipfile.ZipFile(r"G:\6Tipdm\7python辦公自動化\python辦公自動化.zip", "r") as zipobj:
    zipobj.extractall("./文件夾1/")

結果如下:

注意:如果你的壓縮包中“有密碼”,則採用以下方式進行解壓。

4)創建壓縮包
① 對某些文件,創建壓縮包
file_list = ["a.txt", "aa.txt", "文件夾1"]
# 將上述三個文件,進行打包,使用“w”
with zipfile.ZipFile(r"我創建的壓縮包.zip", "w") as zipobj:
    for file in file_list:
        zipobj.write(file)

結果如下:

② 壓縮包已經存在,往其中添加文件
# 往上述壓縮包中,再次添加一個新文件“傻子”文件夾,使用“a”
with zipfile.ZipFile(r"我創建的壓縮包.zip", "a") as zipobj:
    for file in file_list:
        zipobj.write("傻子")

結果如下:


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章