繁体   English   中英

无法通过ftp提取python中的zip

[英]Trouble extracting zip in python over ftp

我正在尝试从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...'

要注意的是,它实际上给了我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是不正确的,但是如果我添加其他任何内容,我的论点就会太多。

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'

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

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

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

干杯!

在不使用PIPE功能作为子流程的情况下设法使其工作。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', '*.*'])

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM