熱線電話:13121318867

登錄
首頁精彩閱讀快看,教你怎么上班摸魚
快看,教你怎么上班摸魚
2021-07-14
收藏

來源:數據STUDIO

作者:云朵君

工作中,當你需要對某個文件夾或多個文件夾內的大量類似文件做相同操作(增刪改查)時,你還在拼命加班做一個沒有感情的工具人嘛?掌握以下幾個操作,瞬間完成任務,然后你就可以摸魚去了。

運用Python進行批量處理,無疑是減少了無限的工作量,將枯燥無味,重復性工作交給機器。你只需要花幾分鐘時間編寫幾行代碼,輕松擺脫工具人,這就是辦公自動化的魅力所在。

快看,教你怎么上班摸魚

在介紹批量處理文件之前,先介紹下Python文件IO的一般操作。

一、OS模塊常用方法

import os

1.os.getcwd( )

方法獲取代碼當前工作路徑


2.os.listdir(path)

獲取當前工作文件夾內的文件夾或文件。

用于返回指定的文件夾包含的文件或文件夾的名字的列表。這個列表以字母順序。它不包括 '.' 和'..'即使它在文件夾中。

  • path -- 需要列出的目錄路徑

3.os.makedirs(path, mode=0o777)

用于遞歸創建目錄。

如果子目錄創建失敗或者已經存在,會拋出一個 OSError 的異常,Windows上Error 183 即為目錄已經存在的異常錯誤。

  • path -- 需要遞歸創建的目錄,可以是相對或者絕對路徑。
  • mode -- 權限模式。

如果第一個參數 path 只有一級,則 mkdir() 函數相同。


4.os.mkdir(path[, mode])

用于以數字權限模式創建目錄。

默認的模式為 0777 (八進制)。如果目錄有多級,則創建最后一級,如果最后一級目錄的上級目錄有不存在的,則會拋出一個 OSError。

  • path -- 要創建的目錄,可以是相對或者絕對路徑。
  • mode -- 要為目錄設置的權限數字模式

5.os.walk(top[, topdown=True[, onerror=None[, followlinks=False]]])

是一個簡單易用的文件、目錄遍歷器,可以幫助我們高效的處理文件、目錄方面的事情。

可以創建一個生成器,用以生成所要查找的目錄及其子目錄下的所有文件。

用于通過在目錄樹中游走輸出在目錄中的文件名,向上或者向下。

  • top -- 根目錄下的每一個文件夾(包含它自己), 產生3-元組(dirpath, dirnames, filenames)【文件夾路徑, 文件夾名字, 文件名】。
  • topdown --可選,為True或者沒有指定, 一個目錄的的3-元組將比它的任何子文件夾的3-元組先產生 (目錄自上而下)。如果topdown為 False, 一個目錄的3-元組將比它的任何子文件夾的3-元組后產生 (目錄自下而上)。
  • onerror -- 可選,是一個函數; 它調用時有一個參數, 一個OSError實例。報告這錯誤后,繼續walk,或者拋出exception終止walk。
  • followlinks -- 設置為True,則通過軟鏈接訪問目錄。

6.os.chdir(path)

用于改變當前工作目錄到指定的路徑。

  • path -- 要切換到的新路徑

7.os.path.abspath(path)

返回絕對路徑


8.os.path.dirname(path)

返回文件路徑


9.os.path.join(path1[, path2[, ...]])

把目錄和文件名合成一個路徑


10.os.path.split(path)

把路徑分割成 dirname 和 basename,返回一個元組


11.os.path.splitext(path)

分割路徑中的文件名與拓展名


12.os.path.walk(path, visit, arg)

遍歷path,進入每個目錄都調用visit函數,visit函數必須有3個參數(arg, dirname, names),dirname表示當前目錄的目錄名,names代表當前目錄下的所有文件名,args則為walk的第三個參數。


13.os.path.exists(path)

路徑存在則返回True,路徑損壞返回False。


二、獲取指定后綴名的文件

當一個文件夾中含有多種類型的文件,以下列舉幾個,有時候實際情況比這更多更復雜,我們需要找到需要的格式文件比較困難,因此批量獲取指定后綴名的文件顯得尤其重要。

快看,教你怎么上班摸魚
import os def find_file(work_dir, extension='jpg'):     """
    獲取指定后綴名的文件
    :param work_dir:傳遞當前目錄
    :param extension:指定的后綴名
    :return: 返回所有目錄下的文件
    """     # 空列表用以存儲獲取到的文件名      lst = []
     for filename in os.listdir(work_dir):
         # 指定文件夾中的文件名逐一打印          print(filename)
         # 獲取得到文件后綴          splits = os.path.splitext(filename)
         file_ext = splits[1# 拿到擴展名         if file_ext == '.' + extension:
             lst.append(filename)
     return lst

函數運用

>>In: find_file('./批處理')
    .ipynb_checkpoints
    Data STUDIO.jpg
    logger.py
    MySQL.zip
    svm.pptx
    test.csv
    text.xls
    text.xlsx
    關注《數據STUDIO》.gif
    成都市地圖.html
    批處理.ipynb
    控規圖.dwg >>Out: ['Data STUDIO.jpg']

三、xls批量轉換成xlsx

此方法是獲取指定后綴名的文件的一個應用,獲取到指定后綴名的文件后對相應文件作一個修改。

import os def batch_rename(work_dir, old_ext ='.xls', new_ext='.xlsx'):     """
    批量重命名后綴
    :param work_dir:傳遞當前目錄
    :param old_ext:原來后綴名
    :param new_ext:新的后綴名后
    """     for filename in os.listdir(work_dir):
          # 獲取得到文件后綴           split_file = os.path.splitext(filename)
          file_ext = split_file[1]
          # 定位后綴名為old_ext 的文件           if old_ext == file_ext:
          # 修改后文件的完整名稱               newfile = split_file[0] + new_ext
              # 實現重命名操作               os.rename(
                  os.path.join(work_dir, filename),
                  os.path.join(work_dir, newfile)
               )
    print("完成重命名")
print(os.listdir(work_dir))

如果將其中的file_ext = split_file[1]改為file_name = split_file[0],后面再做相應的修改,可以變成批量修改文件名稱。

四、批量獲取文件修改時間

這里演示os.walk(path) 的應用。有時我們需要獲取某個具有好幾個層級的目錄下的所有文件,根據條件篩選出某個目標文件,對其做相應的操作。這里演示獲取文件的修改時間。

# 獲取目錄下文件的修改時間 import os
from datetime import datetime print(f"當前時間:{datetime.now().strftime('%Y-%m-%d %H:%M:%S')}")
def get_modify_time(indir):
    for root, _, files in os.walk(indir): # 循環D:批處理目錄和子目錄         for file in files:
            absfile = os.path.join(root, file)
            modtime = datetime.fromtimestamp(os.path.getmtime(absfile))
            now = datetime.now()
            difftime = now-modtime
            if difftime.days < 20# 條件篩選超過指定時間的文件                 print(f"""{absfile}
                    修改時間[{modtime.strftime('%Y-%m-%d %H:%M:%S')}]
                    距今[{difftime.days:3d}天{difftime.seconds//3600:2d}時
                    {difftime.seconds%3600//60:2d}]"""                      ) # 打印相關信息 get_modify_time('./批處理')

輸出

當前時間:2021-02-05 19:21:48     ./MySQL.zip修改時間[2021-01-29 16:46:13]距今[ 7 3時35]              
    ./svm.pptx修改時間[2021-01-21 10:22:12]距今[ 15 8時59]     ./test.csv修改時間[2021-01-25 18:36:40]距今[ 11 0時45]     ./關注《數據STUDIO》.gif修改時間[2021-02-04 11:14:07]距今[ 1 8 7]     ./批處理.ipynb修改時間[2021-02-05 19:21:44]距今[ 0 0 0]     ./.ipynb_checkpoints批處理-checkpoint.ipynb修改時間[2021-02-05 19:57:42]距今[ 0 0時24] 

五、批量壓縮文件

這里同樣運用到os.path.walk(path) 。

另外一個用來做壓縮和解壓的Python模塊--zipfile

壓縮文件

zipfile.ZipFile(file[, mode[, compression[, allowZip64]]])
  • file -- 文件的路徑或類文件對象(file-like object)
  • mode -- 指示打開zip文件的模式,默認值為'r',表示讀已經存在的zip文件,也可以為 'w'或 'a','w'表示新建一個zip文檔或覆蓋一個已經存在的zip文檔, 'a'表示將數據附加到一個現存的zip文檔中;
  • compression -- 在寫zip文檔時使用的壓縮方法,它的值可以是zipfile.ZIP_STORED 或 zipfile.ZIP_DEFLATED。如果要操作的zip文件大小超過2G,應該將allowZip64設置為True。

有如下常用方法

ZipFile.infolist()獲取zip文檔內所有文件的信息,返回一個zipfile.ZipInfo的列表

ZipFile.namelist() 獲取zip文檔內所有文件的名稱列表

ZipFile.printdir()將zip文檔內的信息打印到控制臺上

import zipfile # 加載壓縮文件,創建ZipFile對象 file_dir = './Data STUDIO.zip' zipFile = zipfile.ZipFile(file_dir) print('info:',zipFile.infolist()) print('name:',zipFile.namelist()) print('dir:',zipFile.printdir())

輸出

info[<ZipInfo filename='Data STUDIO.jpg' compress_type=deflate external_attr=0x20 file_size=791106 compress_size=336551>] name['Data STUDIO.jpg'] File Name                                             Modified             Size Data STUDIO.jpg                                2020-11-03 10:01:00       791106 dirNone 

解壓文件

ZipFile.extract(member[, path[, pwd]])

將zip文檔內的指定文件解壓到當前目錄。

  • member -- 指定要解壓的文件名稱或對應的ZipInfo對象;
  • path -- 指定了解析文件保存的文件夾;
  • pwd -- 為解壓密碼。

下面一個例子將保存在程序根目錄下的text.zip內的所有文件解壓到D:/Work 目錄

import zipfile import os
zipFile = zipfile.ZipFile(file_dir) for file in zipFile.namelist():
    zipFile.extract(file, 'd:/Work')
zipFile.close()

另一種解壓zip文檔中的所有文件到當前目錄:

ZipFile.extractall([path[, members[, pwd]]])

members的默認值為zip文檔內的所有文件名稱列表,也可以自己設置,選擇要解壓的文件名稱

批量壓縮文件

import zipfile # 導入zipfile,這個是用來做壓縮和解壓的Python模塊; import os import time def batch_zip(start_dir):     start_dir = start_dir # 要壓縮的文件夾路徑     file_news = start_dir + '.zip' 壓縮后文件夾的名字     z = zipfile.ZipFile(file_news, 'w', zipfile.ZIP_DEFLATED)
    for dir_path, dir_names, file_names in os.path.walk(start_dir):
         print(dir_path)
         print(dir_names)
         print(file_names)
         # 這一句很重要,不replace的話,就從根目錄開始復制          f_path = dir_path.replace(start_dir, '')
         # 實現當前文件夾以及包含的所有文件的壓縮          f_path = f_path and f_path + os.sep 
         for filename in file_names:
             z.write(os.path.join(dir_path, filename), f_path + filename)
     z.close()
     return file_news
batch_zip('E:/批處理/test')

輸出

E:/批處理/test []
['Data STUDIO.jpg''logger.py''MySQL.zip''svm.pptx''test.csv''text.xls''text.xlsx''關注《數據STUDIO》.gif''成都市地圖.html''控規圖.dwg'] 'E:/批處理/test.zip' 

檢驗壓縮效果。

快看,教你怎么上班摸魚

數據分析咨詢請掃描二維碼

若不方便掃碼,搜微信號:CDAshujufenxi

數據分析師資訊
更多

OK
客服在線
立即咨詢
日韩人妻系列无码专区视频,先锋高清无码,无码免费视欧非,国精产品一区一区三区无码
客服在線
立即咨詢