2014-01-08 126 views
1

我想写一个小帮手应用程序来查找我们的备份服务器上的PDF文件。我在一家当地的零售连锁店工作,而我们的文书工作人员偶尔需要从我们的商店进来的报告副本。通常我觉得这是一个程序化的答案,所以我在今天早些时候开始研究它,并且很快就陷入了困境。遍历ZIP文件

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

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

我可以管理遍历这些zip档案。我建立了一个listcomp,它为我要查找的那一天以及它之后的10天建立一个datetime.date对象,然后检查每个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 

回答

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)和一切都与世界。