99999久久久久久亚洲,欧美人与禽猛交狂配,高清日韩av在线影院,一个人在线高清免费观看,啦啦啦在线视频免费观看www

熱線電話:13121318867

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

來源:數(shù)據(jù)STUDIO

作者:云朵君

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

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

快看,教你怎么上班摸魚

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

一、OS模塊常用方法

import os

1.os.getcwd( )

方法獲取代碼當(dāng)前工作路徑


2.os.listdir(path)

獲取當(dāng)前工作文件夾內(nèi)的文件夾或文件。

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

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

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

用于遞歸創(chuàng)建目錄。

如果子目錄創(chuàng)建失敗或者已經(jīng)存在,會(huì)拋出一個(gè) OSError 的異常,Windows上Error 183 即為目錄已經(jīng)存在的異常錯(cuò)誤。

  • path -- 需要遞歸創(chuàng)建的目錄,可以是相對或者絕對路徑。
  • mode -- 權(quán)限模式。

如果第一個(gè)參數(shù) path 只有一級(jí),則 mkdir() 函數(shù)相同。


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

用于以數(shù)字權(quán)限模式創(chuàng)建目錄。

默認(rèn)的模式為 0777 (八進(jìn)制)。如果目錄有多級(jí),則創(chuàng)建最后一級(jí),如果最后一級(jí)目錄的上級(jí)目錄有不存在的,則會(huì)拋出一個(gè) OSError。

  • path -- 要?jiǎng)?chuàng)建的目錄,可以是相對或者絕對路徑。
  • mode -- 要為目錄設(shè)置的權(quán)限數(shù)字模式

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

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

可以創(chuàng)建一個(gè)生成器,用以生成所要查找的目錄及其子目錄下的所有文件。

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

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

6.os.chdir(path)

用于改變當(dāng)前工作目錄到指定的路徑。

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

7.os.path.abspath(path)

返回絕對路徑


8.os.path.dirname(path)

返回文件路徑


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

把目錄和文件名合成一個(gè)路徑


10.os.path.split(path)

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


11.os.path.splitext(path)

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


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

遍歷path,進(jìn)入每個(gè)目錄都調(diào)用visit函數(shù),visit函數(shù)必須有3個(gè)參數(shù)(arg, dirname, names),dirname表示當(dāng)前目錄的目錄名,names代表當(dāng)前目錄下的所有文件名,args則為walk的第三個(gè)參數(shù)。


13.os.path.exists(path)

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


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

當(dāng)一個(gè)文件夾中含有多種類型的文件,以下列舉幾個(gè),有時(shí)候?qū)嶋H情況比這更多更復(fù)雜,我們需要找到需要的格式文件比較困難,因此批量獲取指定后綴名的文件顯得尤其重要。

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

函數(shù)運(yùn)用

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

三、xls批量轉(zhuǎn)換成xlsx

此方法是獲取指定后綴名的文件的一個(gè)應(yīng)用,獲取到指定后綴名的文件后對相應(yīng)文件作一個(gè)修改。

import os def batch_rename(work_dir, old_ext ='.xls', new_ext='.xlsx'):     """
    批量重命名后綴
    :param work_dir:傳遞當(dāng)前目錄
    :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
              # 實(shí)現(xiàn)重命名操作               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],后面再做相應(yīng)的修改,可以變成批量修改文件名稱。

四、批量獲取文件修改時(shí)間

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

# 獲取目錄下文件的修改時(shí)間 import os
from datetime import datetime print(f"當(dāng)前時(shí)間:{datetime.now().strftime('%Y-%m-%d %H:%M:%S')}")
def get_modify_time(indir):
    for root, _, files in os.walk(indir): # 循環(huán)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# 條件篩選超過指定時(shí)間的文件                 print(f"""{absfile}
                    修改時(shí)間[{modtime.strftime('%Y-%m-%d %H:%M:%S')}]
                    距今[{difftime.days:3d}天{difftime.seconds//3600:2d}時(shí)
                    {difftime.seconds%3600//60:2d}]"""                      ) # 打印相關(guān)信息 get_modify_time('./批處理')

輸出

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

五、批量壓縮文件

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

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

壓縮文件

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

有如下常用方法

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

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

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

import zipfile # 加載壓縮文件,創(chuàng)建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文檔內(nèi)的指定文件解壓到當(dāng)前目錄。

  • member -- 指定要解壓的文件名稱或?qū)?yīng)的ZipInfo對象;
  • path -- 指定了解析文件保存的文件夾;
  • pwd -- 為解壓密碼。

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

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

另一種解壓zip文檔中的所有文件到當(dāng)前目錄:

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

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

批量壓縮文件

import zipfile # 導(dǎo)入zipfile,這個(gè)是用來做壓縮和解壓的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ù)制          f_path = dir_path.replace(start_dir, '')
         # 實(shí)現(xiàn)當(dāng)前文件夾以及包含的所有文件的壓縮          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''關(guān)注《數(shù)據(jù)STUDIO》.gif''成都市地圖.html''控規(guī)圖.dwg'] 'E:/批處理/test.zip' 

檢驗(yàn)壓縮效果。

快看,教你怎么上班摸魚

數(shù)據(jù)分析咨詢請掃描二維碼

若不方便掃碼,搜微信號(hào):CDAshujufenxi

數(shù)據(jù)分析師資訊
更多

OK
客服在線
立即咨詢
客服在線
立即咨詢
') } function initGt() { var handler = function (captchaObj) { captchaObj.appendTo('#captcha'); captchaObj.onReady(function () { $("#wait").hide(); }).onSuccess(function(){ $('.getcheckcode').removeClass('dis'); $('.getcheckcode').trigger('click'); }); window.captchaObj = captchaObj; }; $('#captcha').show(); $.ajax({ url: "/login/gtstart?t=" + (new Date()).getTime(), // 加隨機(jī)數(shù)防止緩存 type: "get", dataType: "json", success: function (data) { $('#text').hide(); $('#wait').show(); // 調(diào)用 initGeetest 進(jìn)行初始化 // 參數(shù)1:配置參數(shù) // 參數(shù)2:回調(diào),回調(diào)的第一個(gè)參數(shù)驗(yàn)證碼對象,之后可以使用它調(diào)用相應(yīng)的接口 initGeetest({ // 以下 4 個(gè)配置參數(shù)為必須,不能缺少 gt: data.gt, challenge: data.challenge, offline: !data.success, // 表示用戶后臺(tái)檢測極驗(yàn)服務(wù)器是否宕機(jī) new_captcha: data.new_captcha, // 用于宕機(jī)時(shí)表示是新驗(yàn)證碼的宕機(jī) product: "float", // 產(chǎn)品形式,包括:float,popup width: "280px", https: true // 更多配置參數(shù)說明請參見:http://docs.geetest.com/install/client/web-front/ }, handler); } }); } function codeCutdown() { if(_wait == 0){ //倒計(jì)時(shí)完成 $(".getcheckcode").removeClass('dis').html("重新獲取"); }else{ $(".getcheckcode").addClass('dis').html("重新獲取("+_wait+"s)"); _wait--; setTimeout(function () { codeCutdown(); },1000); } } function inputValidate(ele,telInput) { var oInput = ele; var inputVal = oInput.val(); var oType = ele.attr('data-type'); var oEtag = $('#etag').val(); var oErr = oInput.closest('.form_box').next('.err_txt'); var empTxt = '請輸入'+oInput.attr('placeholder')+'!'; var errTxt = '請輸入正確的'+oInput.attr('placeholder')+'!'; var pattern; if(inputVal==""){ if(!telInput){ errFun(oErr,empTxt); } return false; }else { switch (oType){ case 'login_mobile': pattern = /^1[3456789]\d{9}$/; if(inputVal.length==11) { $.ajax({ url: '/login/checkmobile', type: "post", dataType: "json", data: { mobile: inputVal, etag: oEtag, page_ur: window.location.href, page_referer: document.referrer }, success: function (data) { } }); } break; case 'login_yzm': pattern = /^\d{6}$/; break; } if(oType=='login_mobile'){ } if(!!validateFun(pattern,inputVal)){ errFun(oErr,'') if(telInput){ $('.getcheckcode').removeClass('dis'); } }else { if(!telInput) { errFun(oErr, errTxt); }else { $('.getcheckcode').addClass('dis'); } return false; } } return true; } function errFun(obj,msg) { obj.html(msg); if(msg==''){ $('.login_submit').removeClass('dis'); }else { $('.login_submit').addClass('dis'); } } function validateFun(pat,val) { return pat.test(val); }