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

熱線電話:13121318867

登錄
首頁大數(shù)據(jù)時代用python打造一款文件搜索工具,所有功能自己定義!
用python打造一款文件搜索工具,所有功能自己定義!
2020-09-02
收藏

作者:陳熹 

來源:早起Python

大家好,又到了python辦公自動化系列。在日常的辦公中,我們經(jīng)常會從一堆不同格式的文件(夾)中搜索特定的文件,可能你是憑著記憶去找或是借助軟件,但你有想過如何用python實現(xiàn)嗎?

掃描路徑內(nèi)的內(nèi)容

有些時候我們會希望在當(dāng)前文件夾的成百上千個文件中快速找到需要的文件,如果這個文件夾又包括很多個子文件夾,并不需要程序進(jìn)去查找而無端耗費資源。這就是典型的「掃描一層搜索」

1. 基于 os.scandir()

需求說明

?

輸出C:\Program Files (x86)路徑下名字包含“Windows”的文件夾名稱,并統(tǒng)計個數(shù)

?

步驟分析

這是一個非遍歷的需求,只需要在目的文件夾內(nèi)掃描一圈判斷即可。用到的方法是os.scandir(),使用如下:

import os
path = ...
for file in os.scandir(path): 
    print(file.name, file.path, file.is_dir())

上面代碼最后輸出的是給定路徑下各內(nèi)容的名字、絕對路徑,并判斷其是否是文件夾

需要注意的是os.scandir()只在路徑下一級掃描,需求實現(xiàn)的代碼如下(代碼邏輯很簡單,可以自己做相應(yīng)調(diào)整):

import os
num = 0
for file in os.scandir(r'C:\\Program Files (x86)'):
    if file.is_dir():
        if 'Windows' in file.name:
            print(file.name)
            num += 1
print('含有Windows的文件夾個數(shù)為:', num)

2. 基于 os.listdir()

需求說明

輸出C:\Program Files (x86)路徑下所有可執(zhí)行文件 (即后綴為 .exe)

步驟分析

依然是非遍歷的需求,這里使用os.listdir(),它比os.scandir()簡單一些,可直接調(diào)用輸出名稱而非路徑。后綴名可以用字符串的切片來判斷,但難免失去靈活性。此時建議用字符串方法string.endswith()來判斷名稱的結(jié)尾是否是.exe,代碼如下:

import os 
for file in os.listdir(r'C:\\Program Files (x86)'):
    if file.endswith('.exe'):
        print(file)

三、遍歷文件夾搜索文件

更多時候我們希望給定一個大概的路徑,在這個路徑下的所有文件夾里一層一層找,找到特定文件或者符合要求的文件,這里需要遍歷文件,有兩種主要的方法:

1. 基于 os.walk()

os.walk 遍歷后產(chǎn)生三個參數(shù):當(dāng)前文件夾路徑, 包含文件夾名稱  [列表形式], 包含文件名稱[列表形式],可以用如下代碼完成簡單遍歷:

import os
for dirpath, dirnames, filenames in os.walk(r'C:\\Program Files (x86)'):
    print(f'打開文件夾{dirpath}')
    if dirnames:
        print(dirnames)
    if filenames:
        print(filenames)
    print('-' * 10)

需求說明

遍歷C:\Program Files (x86)找出所有新版Excel文件 (即后綴為.xlsx)

步驟分析

只要理解了os.walk()的工作模式,用endswith()判斷后綴即可。最后如果需要獲得絕對路徑可以把當(dāng)前文件夾路徑和文件名拼接,簡單一點用 + 或者字符串格式化,也可以用os模塊內(nèi)的方法

import os
for dirpath, dirnames, filenames in os.walk(r'C:\\Program Files (x86)'):
    if filenames:
        for i in filenames:
            if i.endswith('.xlsx'):
                print(os.path.join(dirpath, i))

2. 基于非 os 方法:glob

glob在之前的推文也反復(fù)提到遍歷框架:

import glob
for file in glob.glob('**/*', recursive=True): 
    print(file)

**/*的使用表示用通配符指代給定路徑下的任何一層,recursive參數(shù)允許遍歷搜索 由于glob可以使用「通配符」,大大拓寬了靈活程度,這里利用 glob 也來完成上面的需求

需求說明

遍歷C:\Program Files (x86)找出所有新版Excel文件(即后綴為.xlsx)

import glob
for file in glob.glob('**/*.xlsx', recursive=True): 
    print(file)

可以看到非常簡單,在原有代碼基礎(chǔ)上加上后綴名就能夠完成特定類型文件的搜索。如果需要搜索「特定文件」,如遍歷C:\Program Files (x86)找到文件practice.txt,「只需要后一個*改成具體名稱就行」

import glob
for file in glob.glob('**/practice.txt', recursive=True): 
    print(file)

四、寫在最后

通過本文的Python自動化腳本制作過程,我們可以再次體會Python辦公自動化的強(qiáng)大!如果對自動化代碼和數(shù)據(jù)感興趣可以在后臺回復(fù)自動化獲取。

當(dāng)然本文只是基于幾個簡單的需求來講解使用Python來制作搜索文件腳本的主要方法,接下來你可以結(jié)合之前的自動化案例或以根據(jù)自己的需求添加一些其他的規(guī)則或增加新的功能,打造出一款屬于你的軟件!

最后還是希望大家能夠理解Python辦公自動化的一個核心就是「批量操作-解放雙手」,讓復(fù)雜的工作自動化!

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

若不方便掃碼,搜微信號: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)的第一個參數(shù)驗證碼對象,之后可以使用它調(diào)用相應(yīng)的接口 initGeetest({ // 以下 4 個配置參數(shù)為必須,不能缺少 gt: data.gt, challenge: data.challenge, offline: !data.success, // 表示用戶后臺檢測極驗服務(wù)器是否宕機(jī) new_captcha: data.new_captcha, // 用于宕機(jī)時表示是新驗證碼的宕機(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){ //倒計時完成 $(".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); }