遍历ZIP文件

时间:2014-01-08 23:20:47

标签: python python-3.x zipfile

我正在尝试编写一个小帮助应用程序来查找备份服务器上的PDF。我在当地一家零售连锁店工作,做文书工作的员工偶尔会需要我们商店的报告副本。通常情况下,我认为它应该是一个程序性的答案,所以我今天早些时候开始研究它,并且很快就会碰壁。

我对zipfile.ZipFile了解不多,但我所学到的并不足以做我需要做的事情。在我的备份服务器中,我有一组名为comsMMDDYY.zip的档案(我们每天收到一个档案)(MMDDYY作为我们处理文件的日期,通常是每周的周一至周五)。在每个存档中,我有在该日期从每个商店收到的文件集,名为SSSSMMDD.ZIPSS是商店编号,MMDD是这些报告所代表的文书工作日期。

很可能在coms010814.zip里面我会00010106.ZIP - 日期不相关,因为每个商店都会在前一天的文书工作中工作而我们不会收到他们发送的文件数据直到第二天。

我可以管理遍历这些zip档案。我构建了一个listcomp,它在我正在寻找的那一天构建一个datetime.date对象,然后在它之后10天,然后检查每个comsMMDDYY.zip存档以查看它是否包含我请求的com文件,然后我提取它。

问题在于,当我提取我正在寻找的com文件时,它会提取到\\PATH\TO\ARCHIVE\PATH\TO\ARCHIVE\file.zip。它似乎将其目录结构保留在zip文件中,并在我提取它时重新创建它。

我觉得我在这里遇到了XY问题,但是在我超过这一部分之前我无法进入下一步。

My code can be found here,为了清晰起见(我希望)。我的最终目标是做这样的事情:

OUT: Paperwork date (mm/dd/yyyy):
IN: 12/26/2013

OUT: Store Number:
IN: 1

OUT: Which report would you like to print
OUT: 1. report name
OUT: 2. report name
OUT: ...
OUT: n. report name
IN: 2

OUT > Printer the relevant PDF

1 个答案:

答案 0 :(得分:2)

我花了一个小时左右的时间来研究这个问题,并且没有提出任何问题。回到我的问题,我检查了“相关”菜单,看到this question似乎完全解决了我想要做的事情。

对于其他遇到此问题的人,而不是写作:

file = [file for file in zipfilelist.namelist() if file.split('/')[-1] == target]
if file:
    return file

和所有其他的gobbledeegook,我做了:

file = [file for file in zipfilelist.namelist() if file.split('/')[-1] == target]
if file:
    tmp = archive.read(file[0])
    with NamedTemporaryFile(delete=False) as f:
        f.write(tmp)
        return f.name

请注意,我必须使用上下文管理器进行迭代才能执行此操作,因为我从循环中提前退出(因此无法关闭其余文件),但我的目标是在某些位置重构无论如何。现在我在NamedTemporaryFile中拥有了我需要的文件,将名称传递回我的main()循环,然后可以在那里进行操作。当我完成后,我可以os.remove(file)并且一切都与世界相得益彰。