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中Continue语句的用法的举例详解
May 14 Python
Python端口扫描简单程序
Nov 10 Python
深入理解Python分布式爬虫原理
Nov 23 Python
利用Pandas读取文件路径或文件名称包含中文的csv文件方法
Jul 04 Python
使用PM2+nginx部署python项目的方法示例
Nov 07 Python
Python3利用Dlib实现摄像头实时人脸检测和平铺显示示例
Feb 21 Python
Python 生成器,迭代,yield关键字,send()传参给yield语句操作示例
Oct 12 Python
Python按照list dict key进行排序过程解析
Apr 04 Python
完美解决keras保存好的model不能成功加载问题
Jun 11 Python
python中tkinter窗口位置\坐标\大小等实现示例
Jul 09 Python
python删除文件、清空目录的实现方法
Sep 23 Python
python如何调用php文件中的函数详解
Dec 29 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
提升PHP性能的21种方法介绍
2013/06/25 PHP
php使用array_rand()函数从数组中随机选择一个或多个元素
2014/04/28 PHP
php+mysql实现无限级分类
2015/11/11 PHP
解决laravel5中auth用户登录其他页面获取不到登录信息的问题
2019/10/08 PHP
Jquery index()方法 获取相应元素索引值
2012/10/12 Javascript
iframe子父页面调用js函数示例
2013/11/07 Javascript
javascript常用方法汇总
2014/12/02 Javascript
JavaScript实现的链表数据结构实例
2015/04/02 Javascript
nodejs实现遍历文件夹并统计文件大小
2015/05/28 NodeJs
元素绑定click点击事件方法
2015/06/08 Javascript
jquery实现标题字体变换的滑动门菜单效果
2015/09/07 Javascript
javascript中return,return true,return false三者的用法及区别
2015/11/17 Javascript
jQuery使用正则表达式限制文本框只能输入数字
2016/06/18 Javascript
Google 地图叠加层实例讲解
2016/08/06 Javascript
原生js实现网易轮播图效果
2020/04/10 Javascript
Node.js 实现简单的接口服务器的实例代码
2017/05/23 Javascript
浅谈node中的exports与module.exports的关系
2017/08/01 Javascript
js实现QQ面板拖拽效果(慕课网DOM事件探秘)(全)
2017/09/19 Javascript
你应该知道的几类npm依赖包管理详解
2017/10/06 Javascript
jQuery实现的导航条点击后高亮显示功能示例
2019/03/04 jQuery
详细教你微信公众号正文页SVG交互开发技巧
2019/07/25 Javascript
js实现跟随鼠标移动的小球
2019/08/26 Javascript
vuex 实现getter值赋值给vue组件里的data示例
2019/11/05 Javascript
JavaScript HTML DOM 元素 (节点)新增,编辑,删除操作实例分析
2020/03/02 Javascript
你不知道的 TypeScript 高级类型(小结)
2020/08/28 Javascript
vue 插槽简介及使用示例
2020/11/19 Vue.js
python下MySQLdb用法实例分析
2015/06/08 Python
python 表达式和语句及for、while循环练习实例
2017/07/07 Python
python中利用await关键字如何等待Future对象完成详解
2017/09/07 Python
Python数据处理篇之Sympy系列(五)---解方程
2019/10/12 Python
HTML5 Notification(桌面提醒)功能使用实例
2014/03/17 HTML / CSS
祖国在我心中的演讲稿
2014/05/04 职场文书
2014年财务科工作总结
2014/11/11 职场文书
劳动纠纷调解协议书格式
2014/11/30 职场文书
水电工岗位职责
2015/02/14 职场文书
2022年四月新番
2022/03/15 日漫