python 提取文件的小程序

所属分类: 脚本专栏 / python 阅读数: 1843
收藏 0 赞 0 分享
以前提取这些文件用的是一同事些的批处理文件;用起来不怎么顺手,刚好最近在学些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 matplotlib模块及柱状图用法解析

这篇文章主要介绍了Python matplotlib模块及柱状图用法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
收藏 0 赞 0 分享

Python getattr()函数使用方法代码实例

这篇文章主要介绍了Python getattr()函数使用方法代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
收藏 0 赞 0 分享

Python 发送邮件方法总结

这篇文章主要介绍了Python 发送邮件的几种方法,帮助大家更好的理解和学习Python,感兴趣的朋友可以了解下
收藏 0 赞 0 分享

拿来就用!Python批量合并PDF的示例代码

这篇文章主要介绍了Python批量合并PDF的示例代码,帮助大家更好的理解和学习Python,感兴趣的朋友可以了解下
收藏 0 赞 0 分享

Python如何爬取b站热门视频并导入Excel

这篇文章主要介绍了Python如何爬取b站热门视频并导入Excel,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
收藏 0 赞 0 分享

Python进行统计建模

这篇文章主要介绍了Python进行统计建模的方法,帮助大家更好的理解和学习Python,感兴趣的朋友可以了解下
收藏 0 赞 0 分享

Python多线程的退出控制实现

这篇文章主要介绍了Python多线程的退出控制实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
收藏 0 赞 0 分享

如何在python中实现线性回归

这篇文章主要介绍了如何在python中实现线性回归,帮助大家更好的理解和学习Python,感兴趣的朋友可以了解下
收藏 0 赞 0 分享

python多线程semaphore实现线程数控制的示例

这篇文章主要介绍了python多线程semaphore实现线程数控制的示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
收藏 0 赞 0 分享

推荐值得学习的12款python-web开发框架

这篇文章主要介绍了值得学习的12款python-web开发框架,帮助大家更好的理解和学习Python web开发,感兴趣的朋友可以了解下
收藏 0 赞 0 分享
查看更多