Python的ZipFile模块-运行时问题

2024-05-23 16:23:29 发布

您现在位置:Python中文网/ 问答频道 /正文

我在做一个小脚本,按照一定的结构将多个文件夹压缩到多个zip文件中。我把这个结构做成了一个列表。以下是一些条目:

['E:\Documents\UFSCar\Primeiro Ano\Primeiro Semestre\Cálculo 1',
'E:\Documents\UFSCar\Primeiro Ano\Segundo Semestre\Estatistica',
'E:\Documents\UFSCar\Primeiro Ano\Segundo Semestre\Estruturas Discretas',
'E:\Documents\UFSCar\Primeiro Ano\Segundo Semestre\Introdução à Engenharia']

下面是两种将文件压缩在一起的方法。在

^{pr2}$

脚本的主要部分如下:

for i in range(len(myList)):
    zipit(myList[i],os.path.split(myList[i])[1])

我使用了数字索引,因为这样可以使脚本在大量文件中运行良好。在那之前,我们只写了两个zipfiles。这样的话,大约有8个到达终点。不知道为什么。在

该脚本只需迭代列表并将每个列表压缩为一个单独的zipfile。当列表的大小更大时,问题就发生了。我收到以下错误消息。在

Traceback (most recent call last):
  File "E:\Documents\UFSCar\zipit.py", line 76, in <module>
    zipit(listaDisciplinas[i],os.path.split(listaDisciplinas[i])[1])
  File "E:\Documents\UFSCar\zipit.py", line 22, in zipit
    zippy(path, archive)
  File "E:\Documents\UFSCar\zipit.py", line 11, in zippy
    zippy(p,archive)
  File "E:\Documents\UFSCar\zipit.py", line 11, in zippy
    zippy(p,archive)
  File "E:\Documents\UFSCar\zipit.py", line 13, in zippy
    archive.write(p)
  File "C:\Python27\lib\zipfile.py", line 994, in write
    mtime = time.localtime(st.st_mtime)
ValueError: (22, 'Invalid argument')

有人知道是什么导致了这个错误吗? 谢谢!在

编辑:

我用下面提供的代码测试了这些文件,问题是文件的“上次修改”时间戳有问题。不知什么原因,其中一些人最后一次修改是在2049年。在

在这种情况下,Python zipfile模块在压缩文件时失败,因为抛出了ValueError。在

编辑有问题的文件的机会。也许有一天我会验证有没有更好的解决办法。在

谢谢大家的帮助。在


Tags: 文件inpy脚本列表linedocumentsfile
3条回答

与此问题相关的错误报告已于2007年提交:http://bugs.python.org/issue1760357

这个问题是由Windows localtime函数中的一个错误引起的,除了抛出一个ValueError之外,时间模块别无选择。在

我解决了这样的问题:

try:
    zip.write(absfilename, zipfilename)
except ValueError:
    os.utime(absfilename, None)
    zip.write(absfilename, zipfilename)

在实用时间将文件的访问和修改时间更新为当前时间。在

看看这个效果是否更好。至少,您会发现哪个文件出现故障以及原因。在

import os
import os.path
from time import localtime
from zipfile import ZipFile, ZIP_DEFLATED

def zipper(zipfilename, directory):
    archive = ZipFile(zipfilename, "w", ZIP_DEFLATED)
    for root, dirs, files in os.walk(directory):
        for f in files:
            path = os.path.join(root, f)
            try:
                archive.write(path)
            except ValueError, err:
                print "Error compressing %s" % path
                s = os.stat(path)
                print s.st_mtime
                print localtime(s.st_mtime)
                print str(err)
    archive.close()

if __name__ == '__main__':
    zipper('foo.zip', '.')

mtime是上次修改文件的时间戳。所以,对于一个文件,它可能在某种程度上是无效的。找出是什么文件导致的,然后调用os.stat(filename).st_mtime来检查它。在

相关问题 更多 >