Skip to main content
 首页 » 编程设计

python之无法通过 ftp 在 python 中提取 zip

2025年05月04日12Free-Thinker

我正在尝试从 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 的 zip 文件不支持压缩类型 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'