2013-07-25 95 views
2

我試圖從FTP站點解壓文件。我已經在一個子進程中使用7z以及在較舊的os.system格式中使用7z。但是,當我在Python中使用zipfile模塊時,我得到了最接近的結果,所以我決定堅持這一點。無論我如何修改這個我似乎得到兩個錯誤,所以這裏的一個是他們兩個這樣你們能看到我敲我的頭撞在牆上:在Python中通過ftp解壓縮zip的問題

z = zipfile.ZipFile(r"\\svr-dc\ftp site\%s\daily\data1.zip" % item) 
z.extractall() 

NotImplementedError:壓縮型6(爆) (我覺得這個是完全錯誤的,但想我會包括)

我似乎得到最接近的有以下:

z = zipfile.ZipFile(r"\\svr-dc\ftp site\%s\daily\data1.zip" % item) 
z.extractall(r"\\svr-dc\ftp site\%s\daily\data1.zip" % item) 

IOError: [Errno 2] No such file or directory: '\\\\svr-dc...' 

與此美中不足的是,它實際上是給我拉鍊中的第一個文件名。我可以在錯誤結束時看到文件AJ07242013.PRN,因此我感覺更接近,因爲它至少可以讀取zip文件的內容。

幾乎任何迭代,我嘗試讓我這兩個錯誤之一,或語法錯誤,但這很容易解決,而不是我的主要關切。

對不起,這麼長時間囉嗦。我很樂意讓這個工作,所以讓我知道你認爲我需要做什麼。

編輯:

所以7Z終於被添加到路徑並沒有與兩個子以及使用os.system任何錯誤運行通過。不過,我仍然無法解開任何東西。在我看來,從我讀過的所有python文檔中,我應該使用subprocess.communicate()模塊來提取此文件,但它不會解壓縮。當我使用os.system時,它一直告訴我它找不到檔案。

import subprocess 
cmd = ['7z', 'e'] 
sp = subprocess.Popen(cmd, stderr=subprocess.STDOUT, stdout=subprocess.PIPE) 

sp.communicate('r"\C:\Users\boster\Desktop\Data1.zip"') 

我不認爲sp.communicate是正確的,但如果我添加任何東西到它,我有太多的爭論。

回答

0

好不容易纔得到這個不用管的功能subprocess.communicate不會解壓文件。這是使用subprocess.call的解決方案。希望這可以幫助未來的人。

def extract_data_one(): 
    for item in sites: 
     os.chdir(r"\\svr-dc\ftp site\%s\Daily" % item) 
    subprocess.call(['7z', 'e', 'data1.zip', '*.*']) 
0

根據ZipFile文檔,最好先將zip複製到工作目錄。 (http://docs.python.org/2/library/zipfile#zipfile.ZipFile.extract

如果您在複製時遇到問題,可能需要將zip存儲在不含空格的路徑中,或者使用os.path保護您的代碼不受空間限制。

我做了一個小測試,其中我使用了os.path.abspath來確保我有正確的路徑到我的zip並且它正常工作。 還要確保抽取所有指定的路徑是提取zip內容的路徑。 (如果沒有創建指定的文件夾,它將自動創建)如果沒有參數傳遞到抽取所有文件,您的文件將在您當前的工作目錄(CWD)中提取。

乾杯!

1

python的zipfile不支持壓縮類型6(imploded),所以它根本不起作用。在第一種情況下,這從錯誤中很明顯。在第二種情況下,情況更糟。 extractfile的參數是一個備用的解壓縮目錄。既然你給了它你的zip文件的名字,那麼在找到不支持的問題之前,找不到同名的目錄,並且zipfile會放棄。

請確保您可以在命令行上使用7z做到這一點,請嘗試再次實施子流程,並在需要時請求該技術方面的幫助。

這裏有一個腳本,將尋找7Z在平時的地方:

import os 
import sys 
import subprocess 
from glob import glob 

print 'python version:', sys.version 
subprocess.call('ver', shell=True) 
print 

if os.path.exists(r'C:\Program Files\7-Zip'): 
    print 'have standard 7z install' 
    if '7-zip' in os.environ['PATH'].lower(): 
     print '...and its in the path' 
    else: 
     print '...but its not in the path' 
    print 

print 'find in path...' 
found = 0 
for p in os.environ['PATH'].split(os.path.pathsep): 
    candidate = os.path.join(p, '7z.*') 
    for fn in glob(candidate): 
     print ' found', fn 
     found += 1 
print 

if found: 
    print '7z located, attempt run' 
    subprocess.call(['7z']) 
else: 
    print '7z not found' 
+0

所以看來我得到一個「無法找到文件預期」的錯誤從子進程導入。在它失敗之前,我沒有經過這段代碼的第三行。 'import subprocess cmd = ['7z','e','Test.7z','Test','-mx9'] sp = subprocess.Popen(cmd,stderr = subprocess.STDOUT,stdout = subprocess.PIPE )「這似乎是在第三行失敗,甚至沒有進入功能。思考? – Benjooster

+0

而且我知道實際的'7z e'是可以工作的,因爲它會在python之外的命令行中解壓縮項目。 – Benjooster

+0

它應該工作......如果這是任何安慰!它是一個以「系統找不到預期的文件」結尾的python異常堆棧?這意味着它無法找到7z。它是否安裝正確?在你運行常規腳本的同一個地方,比如'subprocess.call(['7z'])'(它應該打印7z幫助)和'os.isfile('Test.7z ')'(它應該是真的)。最後你不需要-mx9,但我認爲這幾乎是無害的。 – tdelaney