python检测文件夹变化,并拷贝有更新的文件到对应目录的方法


Posted in Python onOctober 17, 2018

检测文件夹,拷贝有更新的文件到对应目录 2016.5.19

亲测可用,若有借鉴请修改下文件路径;

学习python小一个月后写的这个功能,属于初学,若有大神路过,求代码优化~

newcopy.py:

检测文件夹中最后修改时间变化的文件,并拷贝复制到相应路径下,拷贝目录会自动检测后输出;测试文件夹路径记得修改;

pyinotify.py:

借用window接口,检测脚本所在目录下文件夹变化(更新、删除、添加等),输出日志到桌面上;

# newcopy.py文件
# -*- coding:UTF-8 -*-
import os
import os.path
import sys
import time
import datetime
import stat
import difflib
import linecache, shutil

# 文件全路径和对应最后修改时间写入到out.txt文档中;
def add_log(path):
 with open('out.txt','w') as f:
  f.close()
 for root , dirs, files in os.walk(path):
  for name in files:
   temp_path = os.path.join(root,name)
   file_name = temp_path.replace('C:/Users/Enter/Desktop/', '')
   file_time = os.stat(temp_path).st_mtime
   with open('out.txt','a') as f:
    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')

def if_exist():

 # 判断文件out.txt是否存在,不存在则创建
 filename = 'out.txt'
 if os.path.exists(filename):
  message = 'OK, the "%s" file exists.'
 else:
  message = "Sorry, I cannot find the '%s' file..and I create it."
  a = open('out.txt', 'w')
  a.close()
 print message % filename

 # 判断update文件夹是否存在,不存在则创建
 files_name='update'
 if os.path.exists(files_name):
  message = 'OK, the "%s" file exists.'
 else:
  message = "Sorry, I cannot find the '%s' file.and I create it. "
  os.mkdir('update')
 print message % files_name


# path 待比较的文件夹路径
# 返回生成的txt(包含更新或者添加的文件路径)的路径
def log_compare(path):

 # 先确保out.txt存在
 if_exist()

 # 获取out.txt文件内容(文件全路径key和最后修改时间value),生成dict
 txt = open('out.txt', 'r').readlines()
 myDic = {}
 for row in txt:
  (key, value) = row.split(',')
  myDic[key] = value
 print myDic

 # 创建以时间命名的文件和文件夹
 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确定是否有更新
 #运行程序时,重新遍历一遍文件全路径和最后修改时间
 for root , dirs, files in os.walk(path):
  for name in files:
   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里值完全对应
   if myDic.has_key(file_name) == True:
    if cmp(myDic[file_name], file_time):  # myDic[file_name]旧最后修改时间,file_time新最后修改时间
     print (file_name,file_time)    # 输出有变化的文件名及其对应的最后修改时间

     # 输出以文件时间命名的更新日志,生成路径是update下
     with open(setup_file_path,'a') as f: # 有更新的文件,写入更新日志
      f.write( '%s\n' % file_name )
      f.close()
   else:
    print "add",file_name
    with open(setup_file_path,'a') as f:   # 新增的文件,写入更新日志
      f.write( '%s\n' % file_name )
      f.close()

  # 返回 当前时间,以时间命名的文件夹路径,更新文件路径
 return (setup_filename, setup_file_dir, setup_file_path)

# 将src目录中的内容拷贝到dest目录
# 如果dest或者其子目录不存在,先创建
# txt_path为更新日志路径,有更新的文件才拷贝
def copy_directory(src, dest, txt_path):
 if not os.path.exists(txt_path):
  print "no file update"
  return

 # 读更新日志,获取更新文件的全路径

 txt = open(txt_path, 'r').readlines()
 myDic = {}
 myDic2 = {}
 for row in txt:
  myDic[row] = "1"
  tempArray = os.path.split(row)
  key = tempArray[0]
  myDic2[key] = "1"

 print "myDic2:", myDic2
 print "dict:", myDic

 # 遍历原始文件夹,得到所有文件的全路径
 for root, dirs, files in os.walk(src):
  for name in files:
   #print "dirs:",dirs
   fpath = os.path.join(root, name)
   newroot = root
   newroot = newroot.replace(src, dest)  # 根据文件绝对路径,创建将要拷贝的路径(相对路径),没有则创建
   #print newroot
   rel_dir = root.replace('C:/Users/Enter/Desktop/', '')
   if not os.path.exists(newroot) and myDic2.has_key(rel_dir):
    print "rel_dir:" , rel_dir
    print newroot
    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'

   if myDic.has_key(rel_path) == True:
    print "real_path:" , rel_path
    # os.mkdir(rel_path)
    shutil.copy(fpath, temp)
    print "copyfile:", fpath


def main():

 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 -*-
import os
import win32file
import win32con
# #检测当前目录下所有文件删除、更新、修改等变化。更新日志输出到桌面。2016.5.23 copy


ACTIONS = {
 1 : "Created",
 2 : "Deleted",
 3 : "Updated",
 4 : "Renamed from something",
 5 : "Renamed to something"
}
# Thanks to Claudio Grondi for the correct set of numbers
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
)
while 1:
 #
 # ReadDirectoryChangesW takes a previously-created
 # handle to a directory, a buffer size for results,
 # a flag to indicate whether to watch subtrees and
 # a filter of what changes to notify.
 #
 # NB Tim Juchcinski reports that he needed to up
 # the buffer size to be sure of picking up all
 # events when a large number of files were
 # deleted at once.
 #
 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

 for action, file in results:
 full_filename = os.path.join (path_to_watch, file)
 print full_filename, ACTIONS.get (action, "Unknown")
 with open('C:/Users/Enter/Desktop/fileupdate.txt','a') as f:
  #str = ','.join( ['%s' % full_filename , '%s\n' % ACTIONS.get (action, "Unknown")] )
  #print str
  f.write( ','.join( ['%s' % full_filename , '%s\n' % ACTIONS.get (action, "Unknown")] ) )
  f.close()

以上这篇python检测文件夹变化,并拷贝有更新的文件到对应目录的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python爬取Coursera课程资源的详细过程
Nov 04 Python
基于循环神经网络(RNN)的古诗生成器
Mar 26 Python
详解Python给照片换底色(蓝底换红底)
Mar 22 Python
python交互模式下输入换行/输入多行命令的方法
Jul 02 Python
解决Django加载静态资源失败的问题
Jul 28 Python
解决django-xadmin列表页filter关联对象搜索问题
Nov 15 Python
MATLAB数学建模之画图汇总
Jul 16 Python
基于python实现删除指定文件类型
Jul 21 Python
Python变量及数据类型用法原理汇总
Aug 06 Python
python3中for循环踩过的坑记录
Dec 14 Python
golang特有程序结构入门教程
Jun 02 Python
Python 全局空间和局部空间
Apr 06 Python
python按时间排序目录下的文件实现方法
Oct 17 #Python
python3 读取Excel表格中的数据
Oct 16 #Python
python在html中插入简单的代码并加上时间戳的方法
Oct 16 #Python
Python对切片命名的实现方法
Oct 16 #Python
Python 给某个文件名添加时间戳的方法
Oct 16 #Python
解决python os.mkdir创建目录失败的问题
Oct 16 #Python
python连接mongodb密码认证实例
Oct 16 #Python
You might like
实现了一个PHP5的getter/setter基类的代码
2007/02/25 PHP
php解决约瑟夫环示例
2014/04/09 PHP
ThinkPHP中处理表单中的注意事项
2014/11/22 PHP
调试WordPress中定时任务的相关PHP脚本示例
2015/12/10 PHP
php构造函数与析构函数
2016/04/23 PHP
php开发最强大的IDE编辑的phpstorm 2020.2配置Xdebug调试的详细教程
2020/08/17 PHP
JS高级笔记
2011/07/13 Javascript
JS实现仿微博可关闭弹出层效果
2015/09/21 Javascript
JS仿淘宝实现的简单滑动门效果代码
2015/10/14 Javascript
基于Jquery+div+css实现弹出登录窗口(代码超简单)
2015/10/27 Javascript
JavaScript深拷贝和浅拷贝概念与用法实例分析
2018/06/07 Javascript
深入理解Promise.all
2018/08/08 Javascript
JavaScript浅层克隆与深度克隆示例详解
2020/09/01 Javascript
vue+flask实现视频合成功能(拖拽上传)
2021/03/04 Vue.js
Python selenium如何设置等待时间
2016/09/15 Python
python实现数据库跨服务器迁移
2018/04/12 Python
python3.6使用urllib完成下载的实例
2018/12/19 Python
Python Tornado核心及相关原理详解
2020/06/24 Python
python实现图像外边界跟踪操作
2020/07/13 Python
Python爬虫与反爬虫大战
2020/07/30 Python
pycharm 的Structure界面设置操作
2021/02/05 Python
ebookers英国:隶属全球最大的在线旅游公司Expedia
2017/12/28 全球购物
美国最佳选择产品网站:Best Choice Products
2019/05/27 全球购物
资生堂英国官网:Shiseido英国
2020/12/30 全球购物
日语专业个人的求职信
2013/12/03 职场文书
护士岗位求职应聘自荐书范文
2014/02/12 职场文书
反腐倡廉标语
2014/06/24 职场文书
个人三严三实对照检查材料
2014/09/25 职场文书
2014年幼儿园个人工作总结
2014/11/10 职场文书
党员民主生活会材料
2014/12/15 职场文书
升学宴答谢词
2015/01/05 职场文书
贷款担保书
2015/01/20 职场文书
银行中层干部培训心得体会
2016/01/11 职场文书
2016年入党心得体会范文
2016/01/23 职场文书
企业转让协议书(范文2篇)
2019/08/15 职场文书
Nginx实现高可用集群构建(Keepalived+Haproxy+Nginx)
2021/05/27 Servers