python检测文件夹变化,并拷贝有更新的文件到对应目录的方法
检测文件夹,拷贝有更新的文件到对应目录2016.5.19
亲测可用,若有借鉴请修改下文件路径;
学习python小一个月后写的这个功能,属于初学,若有大神路过,求代码优化~
newcopy.py:
检测文件夹中最后修改时间变化的文件,并拷贝复制到相应路径下,拷贝目录会自动检测后输出;测试文件夹路径记得修改;
pyinotify.py:
借用window接口,检测脚本所在目录下文件夹变化(更新、删除、添加等),输出日志到桌面上;
#newcopy.py文件
#-*-coding:UTF-8-*-
importos
importos.path
importsys
importtime
importdatetime
importstat
importdifflib
importlinecache,shutil
#文件全路径和对应最后修改时间写入到out.txt文档中;
defadd_log(path):
withopen('out.txt','w')asf:
f.close()
forroot,dirs,filesinos.walk(path):
fornameinfiles:
temp_path=os.path.join(root,name)
file_name=temp_path.replace('C:/Users/Enter/Desktop/','')
file_time=os.stat(temp_path).st_mtime
withopen('out.txt','a')asf:
f.write(','.join(['%s'%file_name,'%s\n'%file_time]))
f.close()
#注意时间格式转换
#file_time=time.localtime(os.stat(root).st_mtime)
#file_time=date.strftime('%Y-%m-%d%H:%M:%S')
defif_exist():
#判断文件out.txt是否存在,不存在则创建
filename='out.txt'
ifos.path.exists(filename):
message='OK,the"%s"fileexists.'
else:
message="Sorry,Icannotfindthe'%s'file..andIcreateit."
a=open('out.txt','w')
a.close()
printmessage%filename
#判断update文件夹是否存在,不存在则创建
files_name='update'
ifos.path.exists(files_name):
message='OK,the"%s"fileexists.'
else:
message="Sorry,Icannotfindthe'%s'file.andIcreateit."
os.mkdir('update')
printmessage%files_name
#path待比较的文件夹路径
#返回生成的txt(包含更新或者添加的文件路径)的路径
deflog_compare(path):
#先确保out.txt存在
if_exist()
#获取out.txt文件内容(文件全路径key和最后修改时间value),生成dict
txt=open('out.txt','r').readlines()
myDic={}
forrowintxt:
(key,value)=row.split(',')
myDic[key]=value
printmyDic
#创建以时间命名的文件和文件夹
setup_filename=str(datetime.datetime.now().strftime('%Y%m%d%H%M%S'))#获取当前时间
setup_file_path='%s%s.txt'%('C:/Users/Enter/Desktop/update/',setup_filename)#生成以当前时间命名的.txt文件,准备写入更新日志
setup_file_dir='%s%s'%('C:/Users/Enter/Desktop/update/',setup_filename)#生成以当前时间命名的.txt文件夹
#判断key,比较value值是否变化
#原始需要有一个out.txt文件,才能比较value确定是否有更新
#运行程序时,重新遍历一遍文件全路径和最后修改时间
forroot,dirs,filesinos.walk(path):
fornameinfiles:
temp_path=os.path.join(root,name)
file_name=temp_path.replace('C:/Users/Enter/Desktop/','')
time=os.stat(temp_path).st_mtime#获取最后修改时间
file_time='%s\n'%time#加%s\n是为了与out.txt里值完全对应
ifmyDic.has_key(file_name)==True:
ifcmp(myDic[file_name],file_time):#myDic[file_name]旧最后修改时间,file_time新最后修改时间
print(file_name,file_time)#输出有变化的文件名及其对应的最后修改时间
#输出以文件时间命名的更新日志,生成路径是update下
withopen(setup_file_path,'a')asf:#有更新的文件,写入更新日志
f.write('%s\n'%file_name)
f.close()
else:
print"add",file_name
withopen(setup_file_path,'a')asf:#新增的文件,写入更新日志
f.write('%s\n'%file_name)
f.close()
#返回当前时间,以时间命名的文件夹路径,更新文件路径
return(setup_filename,setup_file_dir,setup_file_path)
#将src目录中的内容拷贝到dest目录
#如果dest或者其子目录不存在,先创建
#txt_path为更新日志路径,有更新的文件才拷贝
defcopy_directory(src,dest,txt_path):
ifnotos.path.exists(txt_path):
print"nofileupdate"
return
#读更新日志,获取更新文件的全路径
txt=open(txt_path,'r').readlines()
myDic={}
myDic2={}
forrowintxt:
myDic[row]="1"
tempArray=os.path.split(row)
key=tempArray[0]
myDic2[key]="1"
print"myDic2:",myDic2
print"dict:",myDic
#遍历原始文件夹,得到所有文件的全路径
forroot,dirs,filesinos.walk(src):
fornameinfiles:
#print"dirs:",dirs
fpath=os.path.join(root,name)
newroot=root
newroot=newroot.replace(src,dest)#根据文件绝对路径,创建将要拷贝的路径(相对路径),没有则创建
#printnewroot
rel_dir=root.replace('C:/Users/Enter/Desktop/','')
ifnotos.path.exists(newroot)andmyDic2.has_key(rel_dir):
print"rel_dir:",rel_dir
printnewroot
os.makedirs(newroot)
os.chmod(newroot,stat.S_IWRITE)
temp=fpath
temp=temp.replace(src,dest)
rel_path=fpath.replace('C:/Users/Enter/Desktop/','')#将绝对路径改为相对路径,便于遍历对比,挑出要拷贝的文件
rel_path+='\n'
ifmyDic.has_key(rel_path)==True:
print"real_path:",rel_path
#os.mkdir(rel_path)
shutil.copy(fpath,temp)
print"copyfile:",fpath
defmain():
path_dir='C:/Users/Enter/Desktop/acd'
path_file='C:/Users/Enter/Desktop/out.txt'
params=log_compare(path_dir)
add_log(path_dir)
copy_directory(path_dir,params[1],params[2])
if__name__=='__main__':
main()
#pyinotify.py文件
#-*-coding:UTF-8-*-
importos
importwin32file
importwin32con
##检测当前目录下所有文件删除、更新、修改等变化。更新日志输出到桌面。2016.5.23copy
ACTIONS={
1:"Created",
2:"Deleted",
3:"Updated",
4:"Renamedfromsomething",
5:"Renamedtosomething"
}
#ThankstoClaudioGrondiforthecorrectsetofnumbers
FILE_LIST_DIRECTORY=0x0001
path_to_watch="."
hDir=win32file.CreateFile(
path_to_watch,
FILE_LIST_DIRECTORY,
win32con.FILE_SHARE_READ|win32con.FILE_SHARE_WRITE,
None,
win32con.OPEN_EXISTING,
win32con.FILE_FLAG_BACKUP_SEMANTICS,
None
)
while1:
#
#ReadDirectoryChangesWtakesapreviously-created
#handletoadirectory,abuffersizeforresults,
#aflagtoindicatewhethertowatchsubtreesand
#afilterofwhatchangestonotify.
#
#NBTimJuchcinskireportsthatheneededtoup
#thebuffersizetobesureofpickingupall
#eventswhenalargenumberoffileswere
#deletedatonce.
#
results=win32file.ReadDirectoryChangesW(
hDir,
1024,
True,
win32con.FILE_NOTIFY_CHANGE_FILE_NAME|
win32con.FILE_NOTIFY_CHANGE_DIR_NAME|
win32con.FILE_NOTIFY_CHANGE_ATTRIBUTES|
win32con.FILE_NOTIFY_CHANGE_SIZE|
win32con.FILE_NOTIFY_CHANGE_LAST_WRITE|
win32con.FILE_NOTIFY_CHANGE_SECURITY,
None,
None
)
#print"results:",results
foraction,fileinresults:
full_filename=os.path.join(path_to_watch,file)
printfull_filename,ACTIONS.get(action,"Unknown")
withopen('C:/Users/Enter/Desktop/fileupdate.txt','a')asf:
#str=','.join(['%s'%full_filename,'%s\n'%ACTIONS.get(action,"Unknown")])
#printstr
f.write(','.join(['%s'%full_filename,'%s\n'%ACTIONS.get(action,"Unknown")]))
f.close()
以上这篇python检测文件夹变化,并拷贝有更新的文件到对应目录的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。