【问题标题】:Extract files that exist in folders from Zip Archive从 Zip 存档中提取文件夹中存在的文件
【发布时间】:2012-03-30 15:41:20
【问题描述】:

如何从 Zip 存档中存在的目录中提取文件,我从表单上传了 zip 存档(用 HTML 编写),现在如果 Zip 存档包含文件夹,我无法在此文件夹中提取文件,这是一个我的代码中的 sn-p:

form = cgi.FieldStorage() 
file_upload = form['file']
zfile=zipfile.ZipFile(file_upload.file,"r")
files_zip=zfile.namelist()
for name in files_zip:
  print name
  if name.endswith('/'):
      print "yes"
      l=list()
      l=os.listdir(name)
      print l

编辑: 我尝试将StringIO() 用作:

s=StringIO(file_upload)
f=s.getvalue()
with zipfile.ZipFile(f,'r')as z:
         for d in z.namelist():
               print "%s: %s"%(d, z.read(d))

但是第二个sn-p代码的问题是:

No such file or directory: "FieldStorage('file', 'test.zip')

,我想提取这些文件以将它们添加到 GAE BlobStore??

提前致谢。

【问题讨论】:

    标签: python google-app-engine unzip


    【解决方案1】:

    appengine-mapreduce 中有一个如何执行此操作的工作示例。

    input_readers.py 中查看BlobstoreZipInputReader(目前从第898 行开始)。

    【讨论】:

      【解决方案2】:

      我不明白您为什么要使用os.listdir 列出 zip 数据中的文件,您应该只通过名称并提取数据,这是一个示例,我创建了一个内存中的 zip 文件并提取文件,甚至在文件夹中,例如

      from zipfile import ZipFile
      from StringIO import StringIO
      
      # first lets create a zip file with folders to simulate data coming from user
      f = StringIO()
      with ZipFile(f, 'w') as z:
          z.writestr('1.txt', "data of file 1")
          z.writestr('folder1/2.txt', "data of file 2")
      
      zipdata = f.getvalue()
      
      # try to read zipped data containing folders
      f = StringIO(zipdata)
      with ZipFile(f, 'r') as z:
          for name in z.namelist():
              print "%s: %s"%(name, z.read(name))
      

      输出:

      1.txt: data of file 1
      folder1/2.txt: data of file 2
      

      由于 appengine 不允许写入文件系统,您需要读取文件数据(解释为 aboce)并将其转储到 blob,您可以只拥有一个简单的名称和数据结构,但在您的本地操作系统中,您可以尝试z.extractall() 它将创建整个文件夹结构和文件。

      【讨论】:

      • :在我的问题中,用户从表单上传了 zip 存档文件,我需要阅读它,我使用了你的方法来阅读,但是这个在 ZIP 中读取的文件不是文件夹?
      • @Eng_Engineer,在您的情况下,用户也在上传 zip 文件数据,而不是实际文件夹,所以在我的示例中,我首先创建了此类数据(包含文件夹结构),我认为它应该可以工作
      • @Anurag Uniyal:我试过了,我会编辑我的问题,但问题仍然存在
      • @Eng_Engineer 您不需要将 file_upload 包装在 StringIO 中,我已经给您提供了一个如何读取一些压缩数据的示例,在您的情况下,我认为 zipfile.ZipFile(file_upload.file,"r") 应该可以工作,不是吗有用吗?
      • 我试过了,它也不工作,这个问题显示:没有这样的文件或目录:''
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-02
      • 2020-07-10
      • 2014-09-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多