从Zip Archive中提取文件夹中存在的文件

时间:2012-03-30 15:41:20

标签: python google-app-engine unzip

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

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))

但第二段代码的问题是:

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

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

提前致谢。

2 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:1)

我不明白为什么你使用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()它将创建整个文件夹结构和文件。