目的
自己目前在用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)