问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501
你好,欢迎来到懂视!登录注册
当前位置: 首页 - 正文

利用python编程,在多个打包压缩的文件中搜索指定字符串。有很多xml文件...

发布网友 发布时间:2022-04-23 01:22

我来回答

2个回答

热心网友 时间:2022-04-18 09:38

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

热心网友 时间:2022-04-18 10:56

思路就是解压 然后搜索啊
慢慢来 遇到问题再问
声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。
E-MAIL:11247931@qq.com
男朋友比我小很多,现在他说没什么感觉,我该怎么去维持... 大众朗逸车门漏水到车内是什么原因 老朗逸车门进水完美解决办法 华硕B760m主板字母代表什么意思? 技嘉主板的型号字符各代表什么意思? 中考和高考哪个更难些? 中考跟高考,哪个更难?听别人说,中考有一般人是没考上高中的。甚至有人... 2019深圳企业500强 2019年深圳市百强企业 深圳500强企业名单一览_百度... 平安成立时间 优美的生活经典句子 让人惊艳的优美句子(特别经典的优美短句) 如何用unzip一次解压多个.zip文件 三种方法 python 3.2版本 解压rar/zip到指定目录 如何通过python代码解压zip包 python zip函数的用法 抗战胜利70周年阅兵仪式观后感 抗战胜利70周年大阅兵主持人是谁是任鲁豫吗 抗战胜利70周年阅兵有哪些军队 抗日胜利70周年大阅兵有哪些国家军队来 纪念抗战胜利70周年老兵受阅多少人 2015年抗战胜利70周年大阅兵的时候为什么还邀请了意大利和德国? 纪念抗战70周年阅兵邀请了哪些首脑 抗日70周年阅兵仪式,受阅的有哪些部队 抗战胜利70周年阅兵仪式上有几个国家带来军队进行阅兵 抗战70周年大阅兵有女兵方队吗 抗战胜利70周年大阅兵与之前的阅兵有什么不同 看完抗战七十周年的阅兵式有什么感受 2015年的抗战胜利七十周年大阅兵我们的新装备占多少 抗战胜利70周年阅兵是中国第几次大阅兵了 抗战胜利70周年大阅兵有哪些装备 国家规定元宵节放假吗?? 如何在手机下方设置返回键? python的zip函数,有没有与之对应进行相反操作的函数? Python 星*对于元组的列表起什么作用 win7中的python文件pydistutils.cfg文件在哪里? centos7 中没有unzip与zip命令,问遇到这类文件怎么处理 在线的 手机怎么设置返回键盘? 蒸汽烘干和纤维级烘干有什么区别么? 光刻精度高,还是激光雕刻图案精度高??要做那种很精细产品,肉眼不容易察觉那种 车间洁净度达10万级,1万级是什么意思? 什么牌子的烘烤箱质量好,好用呢? 带烘干功能的洗衣机,要求尺寸小一些,至少其中有一面小于500mm,请达人推荐质量和功能都不错的洗衣机 PASCAL高精度阶乘怎么做,最多求100的阶乘和 什么牌子烘干机质量好 问下海尔洗衣机的烘干机好吗? 请问哪种粮食烘干机质量好 茉莉花怎样才会开花 进口电动蝶阀牌子哪个质量好 介绍一下茉莉花? 艺高家用洗碗机好不好?质量如何? 茉莉花的简介
  • 焦点

最新推荐

猜你喜欢

热门推荐