2

我正在尝试从 FTP 站点解压缩文件。我已经尝试在子进程中使用 7z 以及在旧的 os.system 格式中使用 7z。然而,当我在 python 中使用 zipfile 模块时,我最接近,所以我决定坚持使用它。无论我如何编辑它,我似乎都会遇到两个错误之一,所以这里有两个错误,所以你们都可以看到我的头撞到墙上的位置:

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

NotImplementedError: compression type 6 (implode) (我认为这是完全错误的,但我想我会包括在内。)

我似乎最接近以下内容:

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 是正确的,但如果我在其中添加任何其他内容,我的论点就会太多。

4

3 回答 3

1

python 的 zipfile 不支持压缩类型 6(内爆),所以它根本不起作用。在第一种情况下,从错误中可以明显看出这一点。在第二种情况下,情况更糟。extractfile 的参数是一个备用解压缩目录。由于您给它提供了 zip 文件的名称,因此找不到同名的目录,并且 zipfile 在遇到不支持的问题之前就放弃了。

确保您可以在命令行上使用 7z 执行此操作,再次尝试实现 subprocess 并在需要时寻求有关该技术的帮助。

这是一个在通常位置查找 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'
于 2013-07-25T21:11:53.233 回答
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', '*.*'])
于 2013-08-01T15:13:21.840 回答
0

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

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

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

干杯!

于 2013-07-25T21:11:45.943 回答