在客戶那邊建庫,,需要把幾百個(gè)G幾十萬個(gè)文件導(dǎo)入到Oracle里,好不容易導(dǎo)完了才發(fā)現(xiàn)中間缺了好幾大塊數(shù)據(jù),,約有四分之一吧,,郁悶得很。
數(shù)據(jù)是客戶從第三方買的,,據(jù)客戶分析是拷貝過來的時(shí)候有部分?jǐn)?shù)據(jù)漏掉了,,但漏掉的數(shù)據(jù)又沒有什么規(guī)律,加之文件夾的嵌套層數(shù)很多,,查找起來很困難,。
客戶又從第三方那邊拷了一份全的數(shù)據(jù),現(xiàn)在對這個(gè)問題有兩種處理方案,,一種是全部重新導(dǎo)一遍,,大約得花一周多的時(shí)間;另一種方案是把兩個(gè)數(shù)據(jù)的差異找出來,,把差異的部分追加進(jìn)去就行了,。
項(xiàng)目的時(shí)間比較緊張了,只能選第二種方案,,可如何把差異的數(shù)據(jù)找出來呢,,試了幾個(gè)文件夾比較的工具,處理幾百兆的數(shù)據(jù)都吃力,,更不必說這么大量的數(shù)據(jù)和文件了,。
后來想了想,覺得Python解決這個(gè)問題比較方便,,就研究了一下Python里的文件和目錄操作,,很快就完成了下面的一個(gè)腳本,可以很好地解決這個(gè)問題,。
下面的腳本可以在Python24里很好地運(yùn)行,,在其他版本里沒有測試,但用的都是基本功能,,應(yīng)該沒有什么問題,。
代碼里的PathA是全的數(shù)據(jù)的文件夾,PathB是不全的數(shù)據(jù)的文件夾,,PathC是個(gè)新的空目錄,,腳本執(zhí)行完后就把PathA中有且pathB中沒有的文件和目錄都寫到PathC里了,還可以保持原來的目錄結(jié)構(gòu),,速度和正確性都很令人滿意。
因?yàn)槭羌庇玫拇a,,所以寫得不很簡潔,,也不是很規(guī)范,,在此留志,一方面供自己以后參考,,另一方面也提供給需要使用Python進(jìn)行文件和目錄操作的兄弟們共同參考,。
代碼如下:
# coding: GB2312
#系統(tǒng)模塊 import sys import os import shutil #用于文件查找的模塊 from os.path import walk, join, normpath
#這個(gè)是完整的文件夾 PathA = "F:\FullData\" #這個(gè)是缺文件的文件夾 PathB = "F:\IncomplData\"
#這個(gè)是目標(biāo)文件夾 PathC = "F:\DiffData\"
#============================================================ #這個(gè)函數(shù)是用來遞歸處理PathA,對PathA里的每個(gè)文件和文件夾在PathB中找是否有對應(yīng)的文件或文件夾 #若找不到,,則在PathC中創(chuàng)建目錄并拷貝文件 #拷貝文件時(shí)使用了shutil模塊的copy2函數(shù),,以保留文件原來的創(chuàng)建時(shí)間和最后更新時(shí)間 def visit(arg, dirname, names): #把目錄打印出來,以監(jiān)視進(jìn)度 print dirname #得到路徑名后,,把前面的主路徑名去掉 dir=dirname.replace(PathA,"") dirnameB = os.path.join(PathB,dir) dirnameC = os.path.join(PathC,dir) if os.path.isdir(dirnameB): #若PathB里存在對應(yīng)的文件夾,,再逐個(gè)文件判斷是否存在 for file in names: if os.path.isfile(os.path.join(dirname
|