[英]Trouble extracting zip in python over ftp
我正在尝试从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的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'
根据ZipFile文档,最好先将zip复制到您的工作目录中。 ( http://docs.python.org/2/library/zipfile#zipfile.ZipFile.extract )
如果您在复制时遇到问题,则可能需要将zip文件存储在没有空格的路径中,或者使用os.path保护代码中的空格。
我做了一个小型测试,在其中使用os.path.abspath来确保我拥有正确的zip路径并且可以正常工作。 还要确保要提取所有指定的路径是将提取zip内容的路径。 (如果未创建指定的文件夹,则将自动创建该文件夹)如果未将参数传递给extractall,则文件将被提取到当前工作目录(CWD)中。
干杯!
在不使用PIPE功能作为子流程的情况下设法使其工作。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', '*.*'])
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.