繁体   English   中英

访问zipfile中文件夹内的文件

[英]Accessing files inside folders in a zipfile

我想访问zip文件中的文件(xml文件),以便对它们进行一些过滤。 但是,如何深入到zip文件中的文件夹来访问文件? 我的问题是我无法通过zip_file.namelist访问文件如果它们在某些文件夹中,这是我的代码:

import sys, getopt
from lxml import etree
from io import StringIO
import zipfile

def main(argv):

    inputfile = ''
    outputfile = ''
    try:
       opts, args = getopt.getopt(argv,"hi:o:",["ifile=","ofile="])
    except getopt.GetoptError:
       print 'test.py -i <inputfile> -o <outputfile>'
       sys.exit(2)
    for opt, arg in opts:
       if opt == '-h':
          print 'test.py -i <inputfile> -o <outputfile>'
          sys.exit()
       elif opt in ("-i", "--ifile"):
          inputfile = arg
       elif opt in ("-o", "--ofile"):
          outputfile = arg

    archive = zipfile.ZipFile(inputfile, 'r')

    with archive as zip_file:
      for file in zip_file.namelist():
          if file.endswith(".amd"):
              try:

                  print("Process the file")
                  xslt_root = etree.XML('''\
                    <xsl:stylesheet version="1.0"
                    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 

                    <xsl:template match="node() | @*">
                      <xsl:copy>
                          <xsl:apply-templates select="node() | @*"/>
                      </xsl:copy>
                    </xsl:template>


                    <xsl:template match="TimeStamp"/>
                    <xsl:template match="@timeStamp"/>
                    <xsl:template match="TimeStamps"/>
                    <xsl:template match="Signature"/>

                    </xsl:stylesheet>
                    ''')

                  transform = etree.XSLT(xslt_root)

                  doc = etree.parse(zip_file.open(file))
                  result_tree = transform(doc)

                  resultfile = unicode(str(result_tree))
                  zip_file.write(resultfile)


              finally:
                  zip_file.close()

if __name__=='__main__':
     main(sys.argv[1:])

例外:它不能读取“ex4_linktime /”,因为这是一个文件夹而不是文件!

 File "parser.pxi", line 1110, in lxml.etree._BaseParser._parseDocFromFile     (src\lxml\lxml.etree.c:96832)
 File "parser.pxi", line 582, in lxml.etree._ParserContext._handleParseResultDoc (src\lxml\lxml.etree.c:91290)
 File "parser.pxi", line 683, in lxml.etree._handleParseResult (src\lxml\lxml.etree.c:92476)
 File "parser.pxi", line 620, in lxml.etree._raiseParseError (src\lxml\lxml.etree.c:91737)
 IOError: Error reading file 'ex4_linktime/': failed to load external entity "ex4_linktime/"

例外2:它不会写回更改的文件!

 File "C:\Python27\lib\zipfile.py", line 1033, in write
    st = os.stat(filename)
WindowsErrorProcess the file
: [Error 3] The system cannot find the path specified: u'<?xml version="1.0"?   >\n<ComponentData toolVersion="V6.1.4" schemaVersion="6.1.0.0">\n\t<DataSet name="Bank1">...
  • 当您执行etree.parse(file) ,file只是一个字符串。 etree不知道它必须在zip文件中搜索该名称,它只会查看当前目录。 尝试:

     doc = etree.parse(zip_file.open(file)) 
  • 您还必须跳过目录名称 - 这些将具有尾部斜杠:

     for filename in zip_file.namelist(): if filename.endswith('/'): # skip directory names continue 
  • 要更新zip文件,请使用:

     zip_file.writestr(filename, resultfile) 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM