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使用scrapy解析js示例
Jan 23 Python
python正则实现提取电话功能
Feb 24 Python
使用pandas实现csv/excel sheet互相转换的方法
Dec 10 Python
详解Python用户登录接口的方法
Apr 17 Python
浅析Python+OpenCV使用摄像头追踪人脸面部血液变化实现脉搏评估
Oct 17 Python
pyinstaller打包程序exe踩过的坑
Nov 19 Python
Python实现word2Vec model过程解析
Dec 16 Python
python中怎么表示空值
Jun 19 Python
django数据模型中null和blank的区别说明
Sep 02 Python
Scrapy项目实战之爬取某社区用户详情
Sep 17 Python
Python基础教程,Python入门教程(超详细)
Jun 24 Python
Python查找算法的实现 (线性、二分,分块、插值查找算法)
Apr 24 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
递归实现php数组转xml的代码分享
2015/05/14 PHP
PHP中加速、缓存扩展的区别和作用详解(eAccelerator、memcached、xcache、APC )
2016/07/09 PHP
PHP设计模式之装饰器模式实例详解
2018/02/07 PHP
定位地理位置PHP判断员工打卡签到经纬度是否在打卡之内
2019/05/23 PHP
javascript函数库-集合框架
2007/04/27 Javascript
js中访问html中iframe的文档对象的代码[IE6,IE7,IE8,FF]
2011/01/08 Javascript
浅谈javascript中执行环境(作用域)与作用域链
2016/12/08 Javascript
JS实现图片放大缩小的方法
2017/02/15 Javascript
Node.js查找当前目录下文件夹实例代码
2017/03/07 Javascript
Vue.js实现微信过渡动画左右切换效果
2017/06/13 Javascript
JS与jQuery判断文本框还剩多少字符可以输入的方法
2018/09/01 jQuery
angularJs利用$scope处理升降序的方法
2018/10/08 Javascript
react中hook介绍以及使用教程
2020/12/11 Javascript
Vue中inheritAttrs的使用实例详解
2020/12/31 Vue.js
Element el-button 按钮组件的使用详解
2021/02/01 Javascript
详解Python的单元测试
2015/04/28 Python
学习python之编写简单简单连接数据库并执行查询操作
2016/02/27 Python
Python 专题二 条件语句和循环语句的基础知识
2017/03/19 Python
Python列表删除的三种方法代码分享
2017/10/31 Python
完美解决Python matplotlib绘图时汉字显示不正常的问题
2019/01/29 Python
python获取Pandas列名的几种方法
2019/08/07 Python
详解Python利用random生成一个列表内的随机数
2019/08/21 Python
解决tensorboard多个events文件显示紊乱的问题
2020/02/15 Python
Windows10+anacond+GPU+pytorch安装详细过程
2020/03/24 Python
Python中socket网络通信是干嘛的
2020/05/27 Python
面向新手解析python Beautiful Soup基本用法
2020/07/11 Python
python实现每天自动签到领积分的示例代码
2020/08/18 Python
CSS3对背景图片的裁剪及尺寸和位置的设定方法
2016/03/07 HTML / CSS
索引覆盖(Index Covering)查询含义
2012/02/18 面试题
会计学专业学生的求职信范文
2014/01/27 职场文书
学雷锋的心得体会
2014/09/04 职场文书
给病人的慰问信
2015/03/23 职场文书
2015年销售员工作总结范文
2015/04/07 职场文书
义卖募捐活动总结
2015/05/09 职场文书
2015年工商局个人工作总结
2015/07/23 职场文书
解决spring.thymeleaf.cache=false不起作用的问题
2022/06/10 Java/Android