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