我正在尝试编写一个小帮助应用程序来在我们的备份服务器上查找 PDF。我在本地的一家零售链式店工作,负责文书工作的员工有时需要我们商店提供的报告副本。我经常觉得它值得一个程序化的答案,所以我今天早些时候开始研究它,但很快就遇到了困难。
我对zipfile.ZipFile
了解不多,但我所学到的还不足以完成我需要做的事情。在我的备份服务器中,我有一组名为 comsMMDDYY.zip
的存档(我们每天收到的文件一个)(其中 MMDDYY
作为我们处理文件的日期,通常每周周一至周五)。在每个存档中,我都有在该日期从每个商店收到的一组文件,名为 SSSSMMDD.ZIP
(SS
是商店编号,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
最佳答案
我又花了一个小时左右研究这个问题,但一无所获。回到我的问题,我检查了“相关”菜单并看到 this question这似乎完美地解决了我想做的事情。
对于遇到此问题的其他人,不要写:
file = [file for file in zipfilelist.namelist() if file.split('/')[-1] == target]
if file:
return file
以及所有其他的官样文章,我却这样做了:
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)
,一切都很好。
关于python - 遍历 ZIP 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21008671/