利用python编程,在多个打包压缩的文件中搜索指定字符串。有很多xml文件
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了利用python编程,在多个打包压缩的文件中搜索指定字符串。有很多xml文件相关的知识,希望对你有一定的参考价值。
利用python编程,在多个打包压缩的文件中搜索指定字符串。有很多xml文件打包成了多个压缩文件,要指定其中几个,解压后搜索指定字符串,如何用python实现
ziprar.py
__author__ = 'williezh'#!/usr/bin/env python3
import os
import sys
import time
import shutil
import zipfile
from zipfile import ZIP_DEFLATED
#Zip文件处理类
class ZFile(object):
def __init__(self, fname, mode='r', basedir=''):
self.fname = fname
self.mode = mode
if self.mode in ('w', 'a'):
self.zfile = zipfile.ZipFile(fname, mode, compression=ZIP_DEFLATED)
else:
self.zfile = zipfile.ZipFile(fname, self.mode)
self.basedir = basedir
if not self.basedir:
self.basedir = os.path.dirname(fname)
def addfile(self, path, arcname=None):
path = path.replace('//', '/')
if not arcname:
if path.startswith(self.basedir):
arcname = path[len(self.basedir):]
else:
arcname = ''
self.zfile.write(path, arcname)
def addfiles(self, paths):
for path in paths:
if isinstance(path, tuple):
self.addfile(*path)
else:
self.addfile(path)
def close(self):
self.zfile.close()
def extract_to(self, path):
for p in self.zfile.namelist():
self.extract(p, path)
def extract(self, fname, path):
if not fname.endswith('/'):
fn = os.path.join(path, fname)
ds = os.path.dirname(fn)
if not os.path.exists(ds):
os.makedirs(ds)
with open(fn, 'wb') as f:
f.write(self.zfile.read(fname))
#创建Zip文件
def createZip(zfile, files):
z = ZFile(zfile, 'w')
z.addfiles(files)
z.close()
#解压缩Zip到指定文件夹
def extractZip(zfile, path):
z = ZFile(zfile)
z.extract_to(path)
z.close()
#解压缩rar到指定文件夹
def extractRar(zfile, path):
rar_command1 = "WinRAR.exe x -ibck %s %s" % (zfile, path)
rar_command2 = r'"C:\\WinRAR.exe" x -ibck %s %s' % (zfile, path)
try:
res = os.system(rar_command1)
if res == 0:
print("Path OK.")
except:
try:
res = os.system(rar_command2)
if res == 0:
print("Success to unrar the file .".format(path))
except:
print('Error: can not unrar the file '.format(path))
# 解压多个压缩文件到一个临时文件夹
def extract_files(file_list):
newdir = str(int(time.time()))
for fn in file_list:
subdir = os.path.join(newdir, fn)
if not os.path.exists(subdir):
os.makedirs(subdir)
if fn.endswith('.zip'):
extractZip(fn, subdir)
elif fn.endswith('.rar'):
extractRar(fn, subdir)
return newdir
# 查找一个文件夹中的某些文件, 返回文件内容包含findstr_list中所有字符串的文件
def findstr_at(basedir, file_list, findstr_list):
files = []
for r, ds, fs in os.walk(basedir):
for fn in fs:
if fn in file_list:
with open(os.path.join(r, fn)) as f:
s = f.read()
if all(i in s for i in findstr_list):
files.append(os.path.join(r, fn))
return files
if __name__ == '__main__':
files = [i for i in sys.argv[1:] if not i.startswith('-')]
unzipfiles = [i for i in files if i.endswith('.zip') or i.endswith('.rar')]
xmlfiles = [i for i in files if i.endswith('.xml')]
save_unzipdir = True if '-s' in sys.argv else False
findstr = [i.split('=')[-1] for i in sys.argv if i.startswith('--find=')]
findstring = ', '.join(['``'.format(i) for i in findstr])
newdir = extract_files(unzipfiles)
result = findstr_at(newdir, xmlfiles, findstr)
if not result:
msg = 'None of the file(s) contain the given string .'
print(msg.format(findstring))
else:
msg = ' file(s) contain the given string :'
print(msg.format(len(result), findstring))
print('\\n'.join([i.replace(newdir+os.sep, '') for i in sorted(result)]))
if not save_unzipdir:
shutil.rmtree(newdir)$ python3 ziprar.py aaa.zip aaa2.zip aaa3.zip aaa.xml aaa1.xml aaa2.xml --find="It was" --find="when"
None of the file(s) contain the given string `It was`, `when`.
$ python3 ziprar.py aaa.zip aaa2.zip aaa3.zip aaa.xml aaa1.xml aaa2.xml --find="It was" --find="I"
2 file(s) contain the given string `It was`, `I`:
aaa.zip/aaa2.xml
aaa2.zip/aaa2.xml
$ python3 ziprar.py aaa.zip aaa2.zip aaa3.zip aaa.xml aaa1.xml aaa2.xml --find="It was"
2 file(s) contain the given string `It was`:
aaa.zip/aaa2.xml
aaa2.zip/aaa2.xml 参考技术A 思路就是解压 然后搜索啊
慢慢来 遇到问题再问
Linux学习总结(十四) 文件的打包和压缩
文件的压缩和打包,在windos下我们很熟悉.rar和.zip文件,这是两种压缩文件,他们支持单个文件和多个文件的压缩。windos下我们不提及打包的概念,虽然多个文件的压缩肯定存在打包过程。
打包和压缩的区别,从字面意思就可以看出,打包是将多个文件捆绑到一起,目的是方便拷贝和传输,压缩通常是对打包后的再处理,目的是节省资源,比如节省网络带宽,提高传输效率。
从以上结论中,我们就能理解为什么linux会有如此多的打包压缩工具,windos要求操作尽可能简单,linux要求高效和控制力。
几种打包压缩工具和其文件名后缀对应关系:
tar ----- .tar
gzip ------.gz
bzip2 -----.bz2
xz --------.xz
zip -------.zip
一 对于单个文件的处理:
介绍三种压缩工具:
1 gzip 将文件压缩后得到.gz后缀的包,不压缩目录
格式 gzip filename
gzip -d filename.gz 解压缩
gzip -c filename >> filname.gz 保留原文件压缩
gzip -dc filename.gz >> filename 保留原文件解压bzi
2.bzip2
用法基本和gzip一致,得到一个.bz2后缀的包
压缩 bzip2 filename
解压 bzip2 -d filename.bz2
3 xz
压缩 xz filname
解压 xz -d filename.xz
二 对于多个文件的处理:
1.先对文件打包, tar 命令
-c 创建包
-v 可视化
-f 指定文件
-x 解开包
格式 tar -cvf filename.tar filename1 filename2
不想看到过程-v可以不要
tar -xvf filename.tar
-C 可以指定解包路径
2.结合上面三种压缩方式,可以一并打包压缩
-z 用gzip压缩
-j 用bzip2压缩
-J 用xz压缩
那么三种打包并压缩的格式就是:
tar -zcvf filename.tar.gz filename1 filename2
tar -jcvf filename.tar.bz2 filename1 filename2
tar -Jcvf filename.tar.xz filename1 filename2
对应解压格式为:
tar -zxvf filename.tar.gz
tar -jxvf filename.tar.bz2
tar -Jxvf filename.tar.xz
如果你记不准几种格式的参数,那么解压的时候有种偷懒办法,不带格式,
tar -xvf filename.tar.gz 或者filename.tar.bz2 或者filename.tar.xz
系统自动匹配要解压的格式
3.zip压缩与unzip解压
该格式的好处是同时支持windos和linux环境,因此要在该两个环境传输文件首选zip压缩
格式 zip filename.zip filename1 filename2
filename.zip 带路径就可以指定压缩包的路径
-r 级联压缩目录
解压 unzip filename.zip
-d 指定解压目录
unzip filename.zip -d /tmp/
4 几种包的查看
tar包 tar -tf 查看包内文件列表
gzip 包 zcat 查看包内文件内容
bzip2 包 bzcat
xz包 xzcat
5.几种工具对比
gzip bzip2 xz 直接压缩和解压都不保留原文件,除非重定向。
tar zip 默认保留原文件
以上是关于利用python编程,在多个打包压缩的文件中搜索指定字符串。有很多xml文件的主要内容,如果未能解决你的问题,请参考以下文章
qt中如何解包利用python 的struct.pack()函数打包的数据