用python模糊匹配文件夾下的文件并復(fù)制文件到另外的文件夾

目的

自己目前在用VNote寫筆記,這個(gè)筆記軟件非常便于我們管理本地Markdown文件,具體的用法后續(xù)會(huì)單獨(dú)介紹,今天我要記錄的是,怎么用python來復(fù)制特定的文件。

我的Hexo博客文件夾是Onedrive同步的,單獨(dú)的文件夾。博客筆記要更新或者修改,我一般不直接對(duì)Hexo的文件操作,而是有一個(gè)單獨(dú)的筆記本文件夾,覺得可以分享到網(wǎng)絡(luò)上的筆記,我會(huì)復(fù)制到Hexo文件夾下的_post文件目錄。這樣的缺點(diǎn)是有時(shí)候會(huì)不小心直接在Hexo文件夾下改,而原來的本地文件夾的文件沒有修改,造成版本混亂。而且手動(dòng)復(fù)制也很麻煩。有沒有更加自動(dòng)化的操作呢?

用過Linux的都知道,Linux下有通過*來模糊匹配的方法,并且有cp命令來進(jìn)行文件的復(fù)制。windows我不太清楚,打算通過python來實(shí)現(xiàn),也算是一個(gè)學(xué)習(xí)python的機(jī)會(huì)。這是本片筆記的目的

方法

通過網(wǎng)絡(luò)上查詢,知道了可以通過os,shutil包來操作文件,具體的

  • os.listdir() 可以展示某一個(gè)文件夾下的文件以及文件夾。缺點(diǎn)是只能展示一級(jí)文件夾。

  • os.walk() 可以遍歷某一個(gè)文件夾下的所有文件以及文件夾,其返回值根據(jù)該介紹

    OS.walk() generate the file names in a directory tree by walking the tree either top-down or bottom-up. For each directory in the tree rooted at directory top (including top itself), it yields a 3-tuple (dirpath, dirnames, filenames).

os.walk()返回值有三個(gè),其中

 * `dirpath` 是目標(biāo)路徑下所有文件的路徑
 * `dirnames` 是目標(biāo)路徑的所有目錄名稱
 * `dilenames` 是各個(gè)路徑下的文件名稱列表.
  • shutil.copy 復(fù)制文件從一個(gè)文件夾到另外一個(gè)文件夾,但是文件的時(shí)間都是新的。
  • shutil.copy2 復(fù)制文件從一個(gè)文件夾到另外一個(gè)文件夾,但是文件的時(shí)間保留以前的。

具體的用法google以下就行,不在此贅述。

具體實(shí)現(xiàn)

具體實(shí)現(xiàn)時(shí),首先插入所需要的包

import os
from shutil import copy2

然后定義好要操作的文件夾rootdir以及目標(biāo)文件夾dstdir,

rootdir = r'C:\Users\...'
dstdir = r'C:\Users\...'
# 我這里缺省掉了,具體的得替換自己的文件夾即可

然后需要定義一個(gè)函數(shù)來遍歷文件,復(fù)制文件,其定義如下

def get_files(rootdir, dstdir):
    counter = 0 #用來計(jì)數(shù)一共復(fù)制了多少個(gè)文件
    for filepath, dirnames, filenames in os.walk(rootdir): #遍歷文件夾
        for filename in filenames: #遍歷文件
            if 'A_En' in filename or 'B_隨筆' in filename or 'C_教程' in filename or 'D_收集' in filename and filename.endswith('.md'): 
            #設(shè)置條件,文件含有“A_En”或'B_隨筆'...并且以“.md”文件結(jié)尾
                counter = counter+1
                # 結(jié)合文件夾和文件生成完整的絕對(duì)的路徑
                long_name = os.path.join(filepath, filename) 
                #f復(fù)制文件
                copy2(long_name, dstdir)
                print('已經(jīng)復(fù)制了文件: '+long_name)

    print('一共復(fù)制了'+str(counter) + '個(gè)文件')

注釋已經(jīng)寫的很詳細(xì),就不再這里多講了。

完整的代碼

最后,附上完整代碼

import os
from shutil import copy2


def get_files(rootdir, dstdir):
    counter = 0
    for filepath, dirnames, filenames in os.walk(rootdir):
        for filename in filenames:
            if 'A_En' in filename or 'B_隨筆' in filename or 'C_教程' in filename or 'D_收集' in filename and filename.endswith('.md'):
                counter = counter+1
                long_name = os.path.join(filepath, filename)
                copy2(long_name, dstdir)
                print('已經(jīng)復(fù)制了文件: '+long_name)

    print('一共復(fù)制了'+str(counter) + '個(gè)文件')


if __name__ == "__main__":
    rootdir = r'C:Users\test1\'
    dstdir = r'C:\Users\test\'
    get_files(rootdir, dstdir)
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容