【发布时间】:2010-12-13 23:47:32
【问题描述】:
我正在编写一个小脚本,以按照一定的结构将多个文件夹压缩到多个 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']
这里有两种方法可以将文件压缩在一起。
def zipit (path, archname):
# Create a ZipFile Object primed to write
archive = ZipFile(archname, "w", ZIP_DEFLATED) # "a" to append, "r" to read
# Recurse or not, depending on what path is
if os.path.isdir(path):
zippy(path, archive)
else:
archive.write(path)
archive.close()
return "Compression of \""+path+"\" was successful!"
def zippy(path,archive):
paths = os.listdir(path)
for p in paths:
p = os.path.join(path,p)
if os.path.isdir(p):
zippy(p,archive)
else:
archive.write(p)
return
脚本的主要部分是这样的:
for i in range(len(myList)):
zipit(myList[i],os.path.split(myList[i])[1])
我使用了数字索引,因为这使得脚本可以很好地处理大量文件。在此之前,我们只编写了 2 个 zipfile。这样,大约 8 人走到了尽头。不知道为什么。
脚本简单地遍历列表并将每个列表压缩为一个单独的 zip 文件。当列表的大小更大时,就会出现问题。我收到以下错误消息。
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。
我的解决方案:编辑有问题的文件以更改其时间戳。也许有一天我会验证是否有更好的解决方案。
感谢大家的帮助。
【问题讨论】:
-
你能在 zipfile.py 中加入一个打印语句,在这个调用的正上方打印出 st.st_mtime 的值吗?
-
什么是受影响文件的mtime?