python filecmp标准库基础学习

# -*- 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 glob标准库基础学习


下一篇:【转】SyntaxError: Non-ASCII character ‘\xe5′ in file