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

标签 python subprocess 7zip zip 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...'

要注意的是,它实际上为我提供了 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'

关于python - 无法通过 ftp 在 python 中提取 zip,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17868358/

相关文章:

python - 在 Jupyter Notebook 中处理 csv 数据集

Python:如何等到子进程完成初始化

perl - 使用 Perl 模块 IO::Uncompress::AnyUncompress

iphone - iPhone (iOS) 的 7-ZIP (LZMA) 压缩

java - python和java继承差异概述

python - 为什么PyQt5 QPixmap使python崩溃?

python - 如何在 NOT IN 语句中使用 Postgresql ANY 运算符

python - 用 Python 的 Popen 替换 Bash 风格的进程

python - 如何使用路径和参数中的空格从python执行powershell脚本

powershell - 如何从Powershell中7Zip的错误结果中获取错误文件名?