利用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()函数打包的数据

Qt之zip压缩/解压缩(QuaZIP)

Linux文件压缩与打包

利用pyinstaller打包Python项目包含多个文件夹

文件打包压缩

linux的tar命令详情;linux多个文件压缩打包到一个压缩文件