我正在尝试从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...'
实际上,它实际上是在给我拉链中的第一个文件名。我可以在错误结束时看到文件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是正确的,但如果我添加任何其他东西,我有太多的争论。
答案 0 :(得分:1)
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'
答案 1 :(得分:0)
根据ZipFile文档,您可能最好先将zip复制到工作目录。 (http://docs.python.org/2/library/zipfile#zipfile.ZipFile.extract)
如果您在复制时遇到问题,可能需要将zip存储在没有空格的路径中,或者使用os.path保护代码不受空格的影响。
我做了一个小测试,其中我使用os.path.abspath来确保我有正确的拉链路径并且它正常工作。 还要确保对于extractall,您指定的路径是提取zip内容的路径。 (如果未创建指定的文件夹,则会自动创建)如果没有参数传递给extractall,您的文件将在当前工作目录(CWD)中解压缩。
干杯!
答案 2 :(得分: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', '*.*'])