2014-01-08 174 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)和一切都與世界。