无法通过ftp在python中解压缩zip

时间:2013-07-25 20:42:37

标签: python subprocess 7zip zipfile os.system

我正在尝试从FTP站点解压缩文件。我已经尝试在子进程中使用7z以及在旧的os.system格式中使用7z。然而,当我在python中使用zipfile模块时,我最接近,所以我决定坚持下去。无论我怎么编辑这个,我似乎得到了两个错误中的一个,所以这里都是他们两个所以你们都可以看到我在撞墙的地方:

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是正确的,但如果我添加任何其他东西,我有太多的争论。

3 个答案:

答案 0 :(得分:1)

python的zipfile不支持压缩类型6(内爆),所以它根本不起作用。在第一种情况下,从错误中可以看出这一点。在第二种情况下,情况更糟。 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'

答案 1 :(得分:0)

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

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

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

干杯!

答案 2 :(得分:0)

管理以在不使用PIPE功能的情况下使其工作,因为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', '*.*'])