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实现二分查找算法实例
May 26 Python
Pycharm学习教程(6) Pycharm作为Vim编辑器使用
May 03 Python
详解python 字符串和日期之间转换 StringAndDate
May 04 Python
Flask Web开发入门之文件上传(八)
Aug 17 Python
利用Python半自动化生成Nessus报告的方法
Mar 19 Python
Django中reverse反转并且传递参数的方法
Aug 06 Python
Python英文文章词频统计(14份剑桥真题词频统计)
Oct 13 Python
解析PyCharm Python运行权限问题
Jan 08 Python
PyTorch的torch.cat用法
Jun 28 Python
python集合的新增元素方法整理
Dec 07 Python
python 基于selenium实现鼠标拖拽功能
Dec 24 Python
python自动化办公操作PPT的实现
Feb 05 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导出Word文档的原理和实例
2013/10/21 PHP
PHP中unset,array_splice删除数组中元素的区别
2014/07/28 PHP
PHP json_encode() 函数详解及中文乱码问题
2015/11/05 PHP
php微信开发自定义菜单
2016/08/27 PHP
Laravel中10个有用的用法小结
2019/05/06 PHP
laravel7学习之无限级分类的最新实现方法
2020/09/30 PHP
基于jQuery的图片剪切插件
2011/08/03 Javascript
JS图片预加载 JS实现图片预加载应用
2012/12/03 Javascript
基于JQuery 滑动与动画的说明介绍
2013/04/18 Javascript
JS 实现图片直接下载示例代码
2013/07/22 Javascript
jquery实现pager控件示例
2014/04/09 Javascript
dreamweaver 8实现Jquery自动提示
2014/12/04 Javascript
以JavaScript来实现WordPress中的二级导航菜单的方法
2015/12/14 Javascript
jquery实现简单的遮罩层
2016/01/08 Javascript
JavaScript如何实现组合列表框中元素移动效果
2016/03/01 Javascript
js阻止默认浏览器行为与冒泡行为的实现代码
2016/05/15 Javascript
14 个折磨人的 JavaScript 面试题
2016/08/08 Javascript
Vue EventBus自定义组件事件传递
2018/06/25 Javascript
vue相关配置文件详解及多环境配置详细步骤
2020/05/19 Javascript
Python sys.path详细介绍
2013/10/17 Python
Python实现设置windows桌面壁纸代码分享
2015/03/28 Python
Python 支持向量机分类器的实现
2020/01/15 Python
pyqt5数据库使用详细教程(打包解决方案)
2020/03/25 Python
python爬虫---requests库的用法详解
2020/09/28 Python
一文带你掌握Pyecharts地理数据可视化的方法
2021/02/06 Python
日本必酷网络直营店:Biccamera
2019/03/23 全球购物
美国购买体育、音乐会和剧院门票网站:SelectATicket
2019/09/08 全球购物
管理学专业个人求职信范文
2013/12/13 职场文书
大学生简短的自我评价分享
2014/02/20 职场文书
行政人事专员岗位职责
2014/03/05 职场文书
食品安全责任书
2014/04/15 职场文书
给老婆的保证书范文
2014/04/28 职场文书
班级读书活动总结
2014/06/30 职场文书
2019最新版试用期劳动合同模板!
2019/07/04 职场文书
python本地文件服务器实例教程
2021/05/02 Python
pytorch 如何使用amp进行混合精度训练
2021/05/24 Python