通过ftp在python中提取zip时遇到问题

通过ftp在python中提取zip时遇到问题,python,subprocess,7zip,zipfile,os.system,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() 未实现错误:压缩类型6(

我正在尝试从FTP站点解压文件。我在子流程中尝试过使用7z,在旧的os.system格式中也尝试过使用7z。然而,当我在python中使用zipfile模块时,我得到了最接近的结果,所以我决定坚持使用它。无论我如何编辑,我似乎都会遇到两个错误中的一个,这两个错误都是为了让你们都能看到我的头撞在墙上的地方:

z = zipfile.ZipFile(r"\\svr-dc\ftp site\%s\daily\data1.zip" % item)
z.extractall()
未实现错误:压缩类型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...'
这里的问题是它实际上给了我zip中的第一个文件名。我可以在错误结束时看到文件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是正确的,但如果我在其中添加任何其他内容,我会有太多的参数。

根据ZipFile文档,您最好先将zip复制到您的工作目录。()

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

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


干杯

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'

在不将管道功能用作子流程的情况下,成功实现了此功能。Communication不会解压缩文件。下面是使用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', '*.*'])

因此,在从子流程导入时,似乎出现了“找不到预期的文件”错误。在代码失败之前,我无法通过代码的第三行import subprocess cmd=['7z','e','Test.7z','Test','-mx9']sp=subprocess.Popen(cmd,stderr=subprocess.STDOUT,STDOUT=subprocess.PIPE)'第三行似乎失败,甚至无法进入函数。想法?我知道实际的“7ZE”是有效的,因为它将在python之外的命令行中解压项。它应该可以工作。。。如果有什么安慰的话!它是一个以“系统无法找到所需文件”结尾的python异常堆栈吗?这意味着它找不到7z。安装正确吗?在运行常规脚本的同一位置,在交互式python shell中尝试两个测试,如
subprocess.call(['7z'])
(它应该打印7z帮助)和
os.isfile('Test.7z')
(应该是真的)。最后你不需要-mx9,但我认为这基本上是无害的。好吧,7z是有效的,我可以在一个简单的命令行上提供帮助,但它在Python中根本不起作用。我已经重新安装了python和7zip,甚至安装了PyLZMA,但仍然没有成功。有什么想法吗?这对我很有用(微笑)。这一点上所有的镜头都是在黑暗中拍摄的,但是会弹出一个新的命令提示符来确保您拥有最新的环境,键入
where 7z
,然后转到python并查看该路径是否在os.environ['path']中。