python 提取文件的小程序


Posted in Python onJuly 29, 2009

以前提取这些文件用的是一同事些的批处理文件;用起来不怎么顺手,刚好最近在学些python,所有就自己动手写了一个python提取文件的小程序;
1、原理
提取文件的原理很简单,就是到一个指定的目录,找出最后修改时间大于给定时间的文件,然后将他们复制到目标目录,目标目录的结构必须和原始目录一致,这样工程人员拿到后就可以直接覆盖整个目录;
2、实现
为了程序的通用,我定义了下面的配置文件
config.xml

<?xml version="1.0" encoding="utf-8"?> 
<config> 
    <srcdir>E:\temp\home\cargill</srcdir> 
    <destdir>E:\temp\dest\cargill</destdir> 
    <notinclude> 
        <dirs> 
            <dir>E:\temp\home\cargill\WEB-INF\lib</dir> 
            <dir>E:\temp\home\cargill\static\cargill\report</dir> 
        </dirs> 
        <files> 
            <file>E:\temp\home\cargill\WEB-INF\classes\myrumba.xml</file> 
            <file>E:\temp\home\cargill\META-INF\context.xml</file> 
        </files> 
    </notinclude> 
    <inittime>2008-10-11 13:15:22</inittime> 
    <rardir>C:\Program Files\WinRAR</rardir> 
</config>

其中
<srcdir>:原始目录,即我们tomcat的发布目录;
<destdir>:文件复制到得目标目录;
<notinclude>:需要忽略的文件夹和文件,具体需要忽略的内容在其子节点中定义,这里不在解释;
<inittime>:这个是初始化需要提取的时间点,在这之后的才会提取,此处需要说明,后来在使用中,我增加了一个功能,就是每次提取完会自动将本次提取时间记录到一个文本文件C_UPGRADETIME.txt中,这就省去每次设置这个值的烦恼,只有C_UPGRADETIME.txt为空或者不存在时,才会用到这个值;
<rardir>:rar压缩程序的地址;
下面是读取配置文件的类:
config.py
''' 
Created on Mar 3, 2009 
@author: alex cheng 
''' 
from xml.dom.minidom import parse, parseString 
import datetime 
import time 
class config(object): 
''' 
config.xml 
''' 
def __init__(self, configfile): 
''' 
configfile:config files 
''' 
dom = parse(configfile) 
self.config_element = dom.getElementsByTagName("config")[0] 
def getSrcDir(self): 
''' 
return the <srcdir> element value of self.config_element 
''' 
srcDir = self.config_element.getElementsByTagName("srcdir")[0] 
return self.getText(srcDir.childNodes) 
def getDestDir(self): 
''' 
return the <destdir> element value of self.config_element 
''' 
destDir = self.config_element.getElementsByTagName("destdir")[0] 
return self.getText(destDir.childNodes) 
def getNotIncludeDirs(self): 
''' 
return a list, it's the <dir> element values of self_config_element 
''' 
notinclude_dirs = self.config_element.getElementsByTagName("dir") 
dirList = [] 
for node in notinclude_dirs: 
dir = self.getText(node.childNodes) 
if dir != '': 
dirList.append(dir) 
return dirList 
def getNotIncludeFiles(self): 
''' 
return a list, it's the <file> element values of self.config_element 
''' 
notinclude_files = self.config_element.getElementsByTagName("file") 
fileList = [] 
for node in notinclude_files: 
file = self.getText(node.childNodes) 
if file != '': 
fileList.append(file) 
return fileList 
def getText(self, nodeList): 
''' 
return the text value of the nodeList node 
''' 
rc = '' 
for node in nodeList: 
if node.nodeType == node.TEXT_NODE: 
rc = rc + node.data 
return rc 
def getInitTime(self): 
''' 
return a datetime object,it's the <inittime> element value of self.config_element 
''' 
initTime = self.config_element.getElementsByTagName("inittime")[0] 
timeStr = self.getText(initTime.childNodes) 
dt = datetime.datetime.strptime(timeStr, "%Y-%m-%d %H:%M:%S") 
fdt = time.mktime(dt.utctimetuple()) 
return fdt 
def getWinRarDir(self): 
''' 
return the value of <rardir> element value 
''' 
rardir = self.config_element.getElementsByTagName('rardir')[0] 
return self.getText(rardir.childNodes) 
if __name__ == '__main__': 
c = config('config.xml') 
home = c.getSrcDir() 
print('home is ', home) 
dest = c.getDestDir() 
print('dest is ', dest) 
dirlist = c.getNotIncludeDirs() 
print('not include directory is:') 
for n in dirlist: 
print(n) 
filelist = c.getNotIncludeFiles() 
print('not include files is:') 
for n in filelist: 
print(n) 
inittime = c.getInitTime() 
print('inittime is', inittime) 
rardir = c.getWinRarDir() 
print(rardir)

下面是程序的主体:
fetchfile.py
''' 
Created on Mar 3, 2009 
@author: alex cheng 
''' 
from config import config 
from os import chdir, listdir, makedirs, system, walk, remove, rmdir, unlink, \ 
removedirs, stat, getcwd 
from os.path import abspath, isfile, isdir, join as join_path, exists 
from shutil import copy2 
from sys import path 
import datetime 
import re 
import time 
def getdestdir(dir): 
''' 
return the dest directory name; 
it's named by date,for example 20090101; if 20090101 has exist the return 20090101(1),if 20090101(1) has exist also, 
then return 20090101(2), and then... 
''' 
today = datetime.datetime.today() 
strtoday = today.strftime('%Y%m%d') 
dr = join_path(dir, strtoday) 
tmp = dr 
index = 0 
while isdir(tmp): 
tmp = dr 
index = index + 1 
tmp = tmp + '(' + '%d' % index + ')' 
return tmp 
def fetchFiles(srcdir, destdir, ignoredirs, ignorefiles, lasttime=time.mktime(datetime.datetime(2000, 1, 1).utctimetuple())): 
''' 
fetch files from srcdir(source directory) to destdir(dest directory) ignore the notcopydires(the ignore directory list) 
and notcopyfiles(the ignore file list), and the file and directory's modify time after the lasttime 
''' 
chdir(srcdir) # change the current directory to the srcdir 
dirs = listdir('.') # get all files and directorys in srcdir, but ignore the "." and ".." 
dirlist = [] # save all directorys in srcdir 
for n in dirs: 
if isdir(n): 
dirlist.append(n) 
for subdir in dirlist: 
exist = False 
for ignoredir in ignoredirs: 
if join_path(srcdir, subdir) == ignoredir: 
exist = True 
break 
if exist: 
continue 
fetchFiles(join_path(srcdir, subdir), join_path(destdir, subdir), ignoredirs, ignorefiles, lasttime) 
copyfiles(srcdir, destdir, ignorefiles, lasttime) 
def copyfiles(srcdir, destdir, ignorefiles, lasttime): 
''' 
copy the files from srcdir(source directory) to destdir(dest directory, if dest directory not exist then create is) 
ignore the notcopyfiles(the ignore file list) and the file's modify time must after lasttime 
''' 
chdir(srcdir) 
files = filter(isfile, listdir('.')) 
for file in files: 
if isdir(file): # ignore the directory 
continue 
lastmodify = stat(file).st_mtime 
if lastmodify < lasttime: 
continue 
exist = False 
for ignorefile in ignorefiles: 
if join_path(srcdir, file) == ignorefile: 
exist = True 
if not exist: 
if isdir(destdir) is False: 
try: 
makedirs(destdir) 
print('success create directory:', destdir) 
except: 
raise Exception('failed create directory: ' + destdir) 
try: 
copy2(file, join_path(destdir, file)) 
print('success copy file from', join_path(srcdir, file), 'to', join_path(destdir, file)) 
except: 
raise Exception('failed copy file from ' + join_path(srcdir, file) + ' to ' + join_path(destdir, file)) def tarfiles(dir, todir, winrardir, tarfilename): 
''' 
tar all files in dir(a directory) to todir(dest directory) and the tar file named tarfilename 
''' 
if isdir(dir) is False: 
print('the directory', dir, 'not exist') 
return 
chdir(dir) 
commond = '\"' + winrardir + '\\rar.exe\" a -r ' + todir + '\\' + tarfilename + ' *.*' 
print(commond) 
if system(commond) == 0: 
print('success tar files') 
else: 
print('failed tar files') 
def removeDir(dir_file, currentdir): 
''' 
delete the dir_file 
''' 
if isdir(currentdir) is False: 
print() 
return 
chdir(currentdir) 
if not exists(dir_file): 
return 
if isdir(dir_file): 
for root, dirs, files in walk(dir_file, topdown=False): 
for name in files: 
remove(join_path(root, name)) 
for name in dirs: 
rmdir(join_path(root, name)) 
rmdir(dir_file) # remove the main dir 
else: 
unlink(dir_file) 
return 
def getlasttime(): 
''' 
get last modify time from txt files 
''' 
try: 
mypath = abspath(path[0]) #get current path 
file = join_path(mypath, 'C_UPGRADETIME.txt') 
if isfile(file) is False: 
return 0 
f = open(join_path(mypath, 'C_UPGRADETIME.txt'), 'r') 
lines = f.readlines() 
if len(lines) == 0: 
return 0 
line = lines[ - 1] 
dt = datetime.datetime.strptime(line, "%Y-%m-%d %H:%M:%S") 
lasttime = time.mktime(dt.utctimetuple()) 
f.close() 
return lasttime 
except: 
print('failed to get last modify time from txt file') 
return 0 
def registtime(): 
nowstr = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time())) 
nowfloat = time.time() 
mypath = abspath(path[0]) # get current path 
f = open(join_path(mypath, 'C_UPGRADETIME.txt'), 'a') 
f.write('\n' + nowstr) 
f.close() 
def main(): 
c = config('config.xml') 
home = c.getSrcDir() 
dest = c.getDestDir() 
ignoreDirs = c.getNotIncludeDirs() 
ignoreFiles = c.getNotIncludeFiles() 
winRarDir = c.getWinRarDir() 
dest = getdestdir(dest)# get current dest directory 
print ('copy all files to the temp directory ignore last fetch time') 
fetchFiles(home, join_path(dest, 'temp'), ignoreDirs, ignoreFiles) 
print('tar the all files') 
tarfiles(join_path(dest, 'temp'), dest, winRarDir, 'CargillUpdate_ALL.rar') 
print('program sleep 20 seconds to finish the tar thread') 
time.sleep(20) 
print('remove the temp directory...') 
removeDir(join_path(dest, 'temp'), dest) 
print('success remove the temp directory') 
lasttime = getlasttime() # get last modify time from txt files 
if lasttime == 0: 
lasttime = c.getInitTime() 
print ('copy all files to the temp2 directory last modify time after last fetch time') 
fetchFiles(home, join_path(dest, 'temp2'), ignoreDirs, ignoreFiles, lasttime) 
print('tar the all files') 
tarfiles(join_path(dest, 'temp2'), dest, winRarDir, 'CargillUpdate.rar') 
print('program sleep 20 seconds to finish the tar thread') 
time.sleep(20) 
print('remove the temp2 directory...') 
removeDir(join_path(dest, 'temp2'), dest) 
print('success remove the temp2 directory') 
registtime() # regist current time 
if __name__ == '__main__': 
main()
Python 相关文章推荐
python中常用的各种数据库操作模块和连接实例
May 29 Python
使用Python实现一个简单的项目监控
Mar 31 Python
python paramiko模块学习分享
Aug 23 Python
PyQt实现界面翻转切换效果
Apr 20 Python
numpy中loadtxt 的用法详解
Aug 03 Python
Python清空文件并替换内容的实例
Oct 22 Python
简单了解Python生成器是什么
Jul 02 Python
Python使用Pandas对csv文件进行数据处理的方法
Aug 01 Python
Python发送邮件实现基础解析
Aug 14 Python
使用Python的开发框架Brownie部署以太坊智能合约
May 28 Python
OpenCV-Python模板匹配人眼的实例
Jun 08 Python
Python OpenCV实现图像模板匹配详解
Apr 07 Python
Python 文件重命名工具代码
Jul 26 #Python
python 生成目录树及显示文件大小的代码
Jul 23 #Python
python 域名分析工具实现代码
Jul 15 #Python
python 自动提交和抓取网页
Jul 13 #Python
python self,cls,decorator的理解
Jul 13 #Python
python 解析html之BeautifulSoup
Jul 07 #Python
打印出python 当前全局变量和入口参数的所有属性
Jul 01 #Python
You might like
第十一节 重载 [11]
2006/10/09 PHP
php警告Creating default object from empty value 问题的解决方法
2014/04/02 PHP
php使用自定义函数实现汉字分割替换功能示例
2017/01/30 PHP
PHP实现的mysql操作类【MySQL与MySQLi方式】
2017/10/07 PHP
laravel 解决Eloquent ORM的save方法无法插入数据的问题
2019/10/21 PHP
Laravel Eloquent分表方法并使用模型关联的实现
2019/11/25 PHP
深入理解PHP+Mysql分布式事务与解决方案
2020/12/03 PHP
Jquery 动态添加按钮实现代码
2010/05/06 Javascript
JS+CSS 制作的超级简单的下拉菜单附图
2013/11/22 Javascript
用简洁的jQuery方法toggleClass实现隔行换色
2014/10/22 Javascript
js中substring和substr两者区别和使用方法
2015/11/09 Javascript
JavaScript中利用各种循环进行遍历的方式总结
2015/11/10 Javascript
JavaScript模版引擎的基本实现方法浅析
2016/02/15 Javascript
理解javascript正则表达式
2016/03/08 Javascript
JavaScript中对JSON对象的基本操作示例
2016/05/21 Javascript
解析js如何获取css样式
2016/12/11 Javascript
JavaScript实现图片无缝滚动效果
2017/07/07 Javascript
实例解析ES6 Proxy使用场景介绍
2018/01/08 Javascript
web前端vue实现插值文本和输出原始html
2018/01/19 Javascript
基于webpack4搭建的react项目框架的方法
2018/06/30 Javascript
利用jquery和BootStrap实现动态滚动条效果
2018/12/03 jQuery
vue实现公共方法抽离
2020/07/31 Javascript
微信小程序实现日历签到
2020/09/21 Javascript
[01:02:00]DOTA2-DPC中国联赛 正赛 Elephant vs IG BO3 第三场 1月24日
2021/03/11 DOTA
Python中unittest模块做UT(单元测试)使用实例
2015/06/12 Python
Python实现针对json中某个关键字段进行排序操作示例
2018/12/25 Python
python简单验证码识别的实现方法
2019/05/10 Python
Keras:Unet网络实现多类语义分割方式
2020/06/11 Python
通俗讲解python 装饰器
2020/09/07 Python
html5应用缓存_动力节点Java学院整理
2017/07/13 HTML / CSS
国际领先的在线时尚服装和配饰店:DressLily
2019/03/03 全球购物
金蝶的一道SQL笔试题
2012/12/18 面试题
总经理文秘岗位职责
2014/02/03 职场文书
我们的节日端午节活动方案
2014/03/02 职场文书
2014年科技工作总结
2014/11/26 职场文书
趣味运动会新闻稿
2015/07/17 职场文书