2013-07-25 65 views
2

我试图从FTP站点解压文件。我已经在一个子进程中使用7z以及在较旧的os.system格式中使用7z。但是,当我在Python中使用zipfile模块时,我得到了最接近的结果,所以我决定坚持这一点。无论我如何修改这个我似乎得到两个错误,所以这里的一个是他们两个这样你们能看到我敲我的头撞在墙上:在Python中通过ftp解压缩zip的问题

z = zipfile.ZipFile(r"\\svr-dc\ftp site\%s\daily\data1.zip" % item) 
z.extractall() 

NotImplementedError:压缩型6(爆) (我觉得这个是完全错误的,但想我会包括)

我似乎得到最接近的有以下:

z = zipfile.ZipFile(r"\\svr-dc\ftp site\%s\daily\data1.zip" % item) 
z.extractall(r"\\svr-dc\ftp site\%s\daily\data1.zip" % item) 

IOError: [Errno 2] No such file or directory: '\\\\svr-dc...' 

与此美中不足的是,它实际上是给我拉链中的第一个文件名。我可以在错误结束时看到文件AJ07242013.PRN,因此我感觉更接近,因为它至少可以读取zip文件的内容。

几乎任何迭代,我尝试让我这两个错误之一,或语法错误,但这很容易解决,而不是我的主要关切。

对不起,这么长时间啰嗦。我很乐意让这个工作,所以让我知道你认为我需要做什么。

编辑:

所以7Z终于被添加到路径并没有与两个子以及使用os.system任何错误运行通过。不过,我仍然无法解开任何东西。在我看来,从我读过的所有python文档中,我应该使用subprocess.communicate()模块来提取此文件,但它不会解压缩。当我使用os.system时,它一直告诉我它找不到档案。

import subprocess 
cmd = ['7z', 'e'] 
sp = subprocess.Popen(cmd, stderr=subprocess.STDOUT, stdout=subprocess.PIPE) 

sp.communicate('r"\C:\Users\boster\Desktop\Data1.zip"') 

我不认为sp.communicate是正确的,但如果我添加任何东西到它,我有太多的争论。

回答

0

好不容易才得到这个不用管的功能subprocess.communicate不会解压文件。这是使用subprocess.call的解决方案。希望这可以帮助未来的人。

def extract_data_one(): 
    for item in sites: 
     os.chdir(r"\\svr-dc\ftp site\%s\Daily" % item) 
    subprocess.call(['7z', 'e', 'data1.zip', '*.*']) 
0

根据ZipFile文档,最好先将zip复制到工作目录。 (http://docs.python.org/2/library/zipfile#zipfile.ZipFile.extract

如果您在复制时遇到问题,可能需要将zip存储在不含空格的路径中,或者使用os.path保护您的代码不受空间限制。

我做了一个小测试,其中我使用了os.path.abspath来确保我有正确的路径到我的zip并且它正常工作。 还要确保抽取所有指定的路径是提取zip内容的路径。 (如果没有创建指定的文件夹,它将自动创建)如果没有参数传递到抽取所有文件,您的文件将在您当前的工作目录(CWD)中提取。

干杯!

1

python的zipfile不支持压缩类型6(imploded),所以它根本不起作用。在第一种情况下,这从错误中很明显。在第二种情况下,情况更糟。 extractfile的参数是一个备用的解压缩目录。既然你给了它你的zip文件的名字,那么在找到不支持的问题之前,找不到同名的目录,并且zipfile会放弃。

请确保您可以在命令行上使用7z做到这一点,请尝试再次实施子流程,并在需要时请求该技术方面的帮助。

这里有一个脚本,将寻找7Z在平时的地方:

import os 
import sys 
import subprocess 
from glob import glob 

print 'python version:', sys.version 
subprocess.call('ver', shell=True) 
print 

if os.path.exists(r'C:\Program Files\7-Zip'): 
    print 'have standard 7z install' 
    if '7-zip' in os.environ['PATH'].lower(): 
     print '...and its in the path' 
    else: 
     print '...but its not in the path' 
    print 

print 'find in path...' 
found = 0 
for p in os.environ['PATH'].split(os.path.pathsep): 
    candidate = os.path.join(p, '7z.*') 
    for fn in glob(candidate): 
     print ' found', fn 
     found += 1 
print 

if found: 
    print '7z located, attempt run' 
    subprocess.call(['7z']) 
else: 
    print '7z not found' 
+0

所以看来我得到一个“无法找到文件预期”的错误从子进程导入。在它失败之前,我没有经过这段代码的第三行。 'import subprocess cmd = ['7z','e','Test.7z','Test','-mx9'] sp = subprocess.Popen(cmd,stderr = subprocess.STDOUT,stdout = subprocess.PIPE )“这似乎是在第三行失败,甚至没有进入功能。思考? – Benjooster

+0

而且我知道实际的'7z e'是可以工作的,因为它会在python之外的命令行中解压缩项目。 – Benjooster

+0

它应该工作......如果这是任何安慰!它是一个以“系统找不到预期的文件”结尾的python异常堆栈?这意味着它无法找到7z。它是否安装正确?在你运行常规脚本的同一个地方,比如'subprocess.call(['7z'])'(它应该打印7z帮助)和'os.isfile('Test.7z ')'(它应该是真的)。最后你不需要-mx9,但我认为这几乎是无害的。 – tdelaney