【问题标题】:Trouble extracting zip in python over ftp通过 ftp 在 python 中提取 zip 时遇到问题
【发布时间】:2013-07-25 22:57:14
【问题描述】:

我正在尝试从 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 subprocess 7zip zipfile os.system


    【解决方案1】:

    python 的 zipfile 不支持压缩类型 6(内爆),因此它根本无法工作。在第一种情况下,从错误中可以明显看出这一点。在第二种情况下,情况更糟。 extractfile 的参数是一个备用解压缩目录。由于您给它提供了 zip 文件的名称,因此无法找到同名的目录,并且 zipfile 在遇到不支持的问题之前就放弃了。

    确保您可以在命令行上使用 7z 执行此操作,再次尝试实现 subprocess 并在需要时寻求有关该技术的帮助。

    这是一个在通常位置查找 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'
    

    【讨论】:

    • 所以从子进程导入时出现“找不到预期的文件”错误。在它失败之前,我没有通过这段代码的第三行。 '导入子进程 cmd = ['7z', 'e', 'Test.7z', 'Test', '-mx9'] sp = subprocess.Popen(cmd, stderr=subprocess.STDOUT, stdout=subprocess.PIPE)'它似乎在第三行失败,甚至没有进入该功能。想法?
    • 而且我知道实际的 '7z e' 可以工作,因为它会在 python 之外的命令行中解压项目。
    • 它应该可以工作......如果这是任何安慰!是否是以“系统找不到预期的文件”结尾的python异常堆栈?这意味着它找不到 7z。是否正确安装?在您运行常规脚本的同一个地方在交互式 python shell 中尝试几个测试,例如subprocess.call(['7z'])(它应该打印 7z 帮助)和os.isfile('Test.7z')(它应该是 True)。最后你不需要 -mx9,但我认为这基本上是无害的。
    • 好的,7z 是有效的,我可以在一个简单的命令行上提供帮助,但它在 Python 中根本不起作用。我已经重新安装了 python 和 7zip,甚至安装了 PyLZMA,但仍然没有运气。有什么想法吗?
    • 它对我有用(微笑)。此时它的所有镜头都在黑暗中,但打开一个新的命令提示符以确保您拥有最新的环境,输入where 7z,然后转到 python 并查看该路径是否在 os.environ['PATH'] .
    【解决方案2】:

    根据 ZipFile 文档,您最好先将 zip 文件复制到您的工作目录。 (http://docs.python.org/2/library/zipfile#zipfile.ZipFile.extract)

    如果您在复制时遇到问题,您可能希望将 zip 存储在没有空格的路径中,或者使用 os.path 保护您的代码免受空格的影响。

    我做了一个小测试,我使用 os.path.abspath 来确保我有正确的 zip 路径并且它工作正常。 还要确保对于 extractall,您指定的路径是将提取 zip 内容的路径。 (如果没有创建指定的文件夹,则会自动创建)如果没有参数传递给extractall,您的文件将被提取到您当前的工作目录(CWD)中。

    干杯!

    【讨论】:

      【解决方案3】:

      设法在不使用 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', '*.*'])
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-01-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-10-06
        • 2018-12-08
        相关资源
        最近更新 更多