利用python實現兩個資料夾的同步

2022-09-15 03:12:10 字數 4841 閱讀 6242

其實無論windows還是linux,簡單地去實現兩個兩個資料夾的同步只需系統自帶的複製命令加引數就可以了。

xcopy 源資料夾\* 目標資料夾 /s /e /y

cp -r 源資料夾/*

目標資料夾

這裡使用python來實現這些基本功能,並增加一些去重之類的增強功能。

要想同步兩個資料夾中的資料,基本思路首先需要遍歷源資料夾中的資訊,將源資料夾中的檔案複製到目標資料夾。

遍歷資料夾採用os中的listdir函式就可以了。

1

importos2

3 path_s = '

f:\\test\\s

'4 path_t = '

f:\\test\\t'5

6for filename in

os.listdir(path_s):

7 filename_s = path_s+os.sep+filename

8print

'[*] source :

',filename_s

9 filename_t = path_t+os.sep+filename

10print

'[*] target :

',filename_t

11 with open(filename_s,'rb'

) as f_s:

12 with open(filename_t,'wb'

) as f_t:

13 f_t.write(f_s.read())

但是很明顯這裡沒有考慮源資料夾中還會存在資料夾甚至多重資料夾的情況。

乙個簡單的思路就是:在遍歷源資料夾內的檔案時,先判定當前檔案這是檔案還是資料夾。如果當前檔案是資料夾的話,開始遍歷此資料夾內的檔案,如果裡面還有資料夾,遍歷這個資料夾,依次類推。利用遞迴的方法,**如下:

1

importos2

34 path_s = '

f:\\test\\s

'5 path_t = '

f:\\test\\t'6

78defcopy_file(paths,patht):

9for filename in

os.listdir(paths):

10 filename_s = paths+os.sep+filename

11 filename_t = patht+os.sep+filename

12if

os.path.isdir(filename_s):

13if

notos.path.exists(filename_t):

14os.mkdir(filename_t) #在目標資料夾中建立對應的資料夾

15copy_file(filename_s,filename_t) # 遞迴

16else:17

print

'[*] source :

',filename_s

1819

print

'[*] target :

',filename_t

20 with open(filename_s,'rb'

) as f_s:

21 with open(filename_t,'wb'

) as f_t:

22f_t.write(f_s.read())

2324

25 copy_file(path_s,path_t)

目前,簡單的資料夾複製功能已經實現了。

乙個簡單的方法就是在目標資料夾中複製檔案之前先利用函式「os.path.exists」判定這個檔案是否存在。

1

importos2

34 path_s = '

f:\\test\\s

'5 path_t = '

f:\\test\\t'6

7def

copy_file(paths,patht):

8for filename in

os.listdir(paths):

9 filename_s = paths+os.sep+filename

10 filename_t = patht+os.sep+filename

11if

os.path.isdir(filename_s):

12if

notos.path.exists(filename_t):

13os.mkdir(filename_t)

14copy_file(filename_s,filename_t)

15else:16

ifos.path.exists(filename_t):

17print

'[*] "%s" already exists!

' %filename_t

18else:19

print

'[*] source :

',filename_s

2021

print

'[*] target :

',filename_t

22 with open(filename_s,'rb'

) as f_s:

23 with open(filename_t,'wb'

) as f_t:

24f_t.write(f_s.read())

2526 copy_file(path_s,path_t)

這個辦法避免了一部分已有檔案的重複複製操作,減少了部分不必要的讀寫操作,但是卻無法消除內容相同但名稱、路徑不同的重複檔案。

目前判定兩個檔案是否相同,除了按位元組逐個對比這個笨方法外,簡單常用的辦法就是利用md5和crc校驗,或是按一定規律挑取檔案的指定位置的資料塊就行對比。

這次利用檔案的md5值,將目標資料夾中已有檔案的md5值儲存到列表或字典中,每在源資料夾中讀取乙個檔案就判定該檔案的md5值是否已經存在於md5列表,沒有的話再進行複製操作,並將該檔案的md5值寫入列表。

import

osimport

hashlib

path_s = '

f:\\test\\s

'path_t = '

f:\\test\\t

'list_file ={}

defcreate_file_list(path):

for name in

os.listdir(path):

filename = path+os.sep+name

ifos.path.isdir(filename):

create_file_list(filename)

else

: with open(filename,'rb

') as f:

md5 =hashlib.md5(f.read()).hexdigest()

if md5 not

inlist_file:

list_file[md5] = 1

defcopy_file(paths,patht):

for filename in

os.listdir(paths):

filename_s = paths+os.sep+filename

filename_t = patht+os.sep+filename

ifos.path.isdir(filename_s):

ifnot

os.path.exists(filename_t):

os.mkdir(filename_t)

copy_file(filename_s,filename_t)

else

:

ifos.path.exists(filename_t):

print

'[*] "%s" already exists!

' %filename_t

else

: with open(filename_s,'rb

') as f_s:

data =f_s.read()

file_md5 =hashlib.md5(data).hexdigest()

if file_md5 not

inlist_file:

list_file[file_md5] = 1

print

'[*] source :

',filename_s

print

'[*] target :

',filename_t

with open(filename_t,'wb

') as f_t:

f_t.write(data)

else

:

print

'[*] "%s"\'s md5 already exists!

' %filename_t

create_file_list(path_t)

copy_file(path_s,path_t)

如下圖,執行後內容相同的幾個檔案,只有第一次讀取到的時候才寫入目標資料夾,其他路徑下的檔案並沒有複製到目標資料夾。

matlab 比較兩個資料夾內CSV資料夾

比較兩個資料夾的檔名,不同則刪除 比較兩個資料夾下檔名,輸出檔案不同的檔名 stra strb str11 stra,csv jiegou1 dir str11 等價於下面這行 geshu1 length jiegou1 str12 strb,csv jiegou2 dir str12 等價於下面這...

使用diff比較兩個資料夾

最近經常的要比較不同版本的原始檔,由於檔案比較多,比較想通過兩個目錄的比較直接得到,版本之間的不同之處,開始使用beyond compare,感覺很好用,但是不太習慣紅色的配色,又比較懶惰的不想更改配色,所以選擇了使用diff配合vim的方法來檢視檔案的不同。經過檢視diff的幫助說明,得到下面的命...

使用diff比較兩個資料夾

diff c a r b x bak a b ab.diff c 採用content的format輸出different a 強制使用text的模式 r 遞迴到子目錄裡去 b 忽略空白的不同 x 過濾掉所比較目錄中一些不想比較的檔案型別,可以使用其他的pattern 實際上如果需要過濾的檔案型別比較...