標籤:
# -*- coding: utf-8 -*-
# 作者:新手
__author__ = ‘Administrator‘
#檔案的比較
import os,filecmp
#作用用於比較系統中的目錄和檔案
#例子2
def mkfile(name,body=None):
with open(name,‘w‘)as name1:
name1.write(body or name)
return
def mk_dir(top):
if not os.path.exists(top):
os.mkdir(top)
curdir=os.getcwd()
os.chdir(top)
os.mkdir(‘dir1‘)
os.mkdir(‘dir2‘)
mkfile(‘dir1/file_only_in_dir1‘)
mkfile(‘dir2/file_only_in_dir2‘)
os.mkdir(‘dir1/file_only_in_dir1‘)
os.mkdir(‘dir2/file_only_in_dir2‘)
os.mkdir(‘dir1/common_file‘)
os.mkdir(‘dir2/common_file‘)
mkfile(‘dir1/common_file‘,‘this file is the same‘)
mkfile(‘dir2/common_file‘,‘this file is the same‘)
mkfile(‘dir1/not_the_same‘)
mkfile(‘dir2/not_the_same‘)
mkfile(‘dir1/file_in_dir1‘,‘This is a file in dir1‘)
os.mkdir(‘dir2/file_in_dir1‘)
os.chdir(curdir)
return
if __name__==‘__main‘:
os.chdir(os.path.dirname(__file__)or os.getcwd())
print mk_dir(‘example1‘)
print mk_dir(‘example1/dir1/common_dir‘)
print mk_dir(‘example1/dir2/common_dir‘)
#比較目錄/檔案
print u‘比較:‘,filecmp.cmp(r‘a\a.txt‘,r‘a\b.txt‘,shallow=True)
print u‘比較:‘,filecmp.cmp(r‘a\a.txt‘,r‘a\1.doc‘,shallow=True)
"""
shallow解釋:參數它會cmp()除了檔案中繼資料外,是否還要查看檔案內容,預設情況下使用os.stat()得到資訊完成一個淺比較,而不查看內容,對於同時建立的相同大小檔案,如果不比較其內容,會報告錯誤
如果非遞迴比較2個目錄中一組檔案,可以使用cmpfiles(),參數是目錄名和2個位置上檢查的檔案清單
,傳入公用檔案清單應當只包含檔案名稱(目錄會導致匹配不成功),而且這些檔案在2個位置上都應當出現,
"""
#例3
d1_contents=set(os.listdir(r‘a‘))
d2_contents=set(os.listdir(r‘a‘))
com=list(d1_contents & d2_contents)
f=[f for f in com if os.path.isfile(os.path.join(r‘a‘,f))]
print f
a,b,c=filecmp.cmpfiles(r‘a‘,r‘a‘,f)
print a,b,c
#comfiles()返回3個檔案清單,分別包含匹配檔案,不匹配檔案和不能比較檔案(由於許可權或者出於其他原因)
#比較目錄:report()會列印比較2個目錄的報告
filecmp.dircmp(r‘a‘,r‘a‘).report()
"""
它是輸出一個純文字報告,顯示結果只包括給定目錄內容,而不會遞迴比較其子目錄,在這邊,檔案(a)被認為是相同的,因為並沒有比較內容,無法讓dircmp像cmp()那樣比較
想要完成詳細的遞迴比較,可以使用report_full_closure()
"""
filecmp.dircmp(r‘a‘,r‘a‘).report_full_closure()
#將輸出包括所有同級子目錄的比較
#程式中使用差異
#在請求計算時,對於未使用的資料,建立dircmp執行個體並不會帶來開銷
import pprint
dc=filecmp.dircmp(r‘a‘,r‘a‘)
print ‘left:‘,
pprint.pprint(dc.left_list)
print ‘\nrigjt:‘
pprint.pprint(dc.right_list)
#比較目錄中包含檔案和子目錄分別列表left_list和right_list中
#可以向建構函式傳入一個要忽略名字列表(該列表中指定的名字將被忽略),對輸入進行過濾,預設情況下 ,RCS CVS和tags等名字會被忽略
dc=filecmp.dircmp(r‘a‘,r‘a‘,ignore=[‘common_file‘])
print ‘left1:‘,
pprint.pprint(dc.left_list)
print ‘\nrigjt1:‘
pprint.pprint(dc.right_list)
#‘common_file‘這個會被從檔案清單中被刪除掉
#2個輸入目錄共有的檔案名稱會儲存在common,各目錄專屬的檔案會在left_only和right_only中
dc=filecmp.dircmp(r‘a‘,r‘a‘)
print ‘left2:‘,
pprint.pprint(dc.left_only)
print ‘\nrigjt2:‘
pprint.pprint(dc.right_only)
#left目錄是dircmp()第一個參數,right是第二個參數
#公用成員可以進一步分解為檔案,目錄和有趣(funny)元素(2個目錄中類型不同的內容或者os.stat()指出錯誤的地方)
dc=filecmp.dircmp(r‘a‘,r‘a‘)
print ‘leftx:‘,
pprint.pprint(dc.common_dirs)
print ‘\nrigjtx:‘
pprint.pprint(dc.common_files)
pprint.pprint(dc.common_funny)
#檔案之間的差別可以做類似的劃分
dc=filecmp.dircmp(r‘a‘,r‘a‘)
print dc.same_files,dc.diff_files,dc.funny_files
#最後一點,子目錄也會儲存,從而能視窗地完成遞迴比較
dc=filecmp.dircmp(r‘a‘,r‘a‘)
print dc.subdirs
#屬性subdirs是一個字典,將目錄名映射到新的dircmp[對象
#Directories:使用os列出一個目錄的內容
#此模組的官方文檔:https://docs.python.org/2.7/library/filecmp.html?highlight=filecmp#module-filecmp
python filecmp標準庫基礎學習