2013-07-25 3 views
2

Я пытаюсь разархивировать файл с FTP-сайта. Я пробовал его с использованием 7z в подпроцессе, а также с использованием 7z в более раннем формате os.system. Я становлюсь ближе, но когда я использую модуль zipfile в python, я решил придерживаться этого. Независимо от того, как я изменить это, я, кажется, чтобы получить один из двух ошибок, так здесь оба из них так вы все можете увидеть, где я стучал головой о стену:Устранение неполадок zip в python через ftp

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...' 

Загвоздка с этим, что это на самом деле давая мне первое имя файла в zip. Я вижу файл AJ07242013.PRN в конце ошибки, поэтому я чувствую себя ближе, потому что он по крайней мере доходит до чтения содержимого zip-файла.

Практически любая итерация этого, которую я пытаюсь получить, дает мне одну из этих двух ошибок или синтаксическую ошибку, но это легко решить, а не мою главную проблему.

Извините за то, что вы так долго наматывались. Я бы хотел, чтобы это работало, поэтому дайте мне знать, что вы думаете, что мне нужно делать.

EDIT:

Так 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, чтобы убедиться, что у меня есть правильный путь к моему почтовому индексу, и он работал правильно. Также убедитесь, что для extractall указанный вами путь - это путь, в котором будет извлекаться содержимое zip. (Если папка, которая указана, не создана, она будет создана автоматически). Ваши файлы будут извлечены в вашем текущем рабочем каталоге (CWD), если ни один параметр не передан extractall.

Cheers!

1

zipfile python не поддерживает тип сжатия 6 (взорванный), поэтому его просто не будет работать. В первом случае это очевидно из ошибки. Во втором случае все хуже. Параметр 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

Похоже, что я получаю сообщение об ошибке «Не могу найти ожидаемый файл» при импорте из подпроцесса. Я не прохожу мимо третьей строки этого кода до сбоя. 'подпроцесс импорта 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. Правильно ли он установлен? Попробуйте выполнить несколько тестов в интерактивной оболочке python из того же места, где вы запускаете свой обычный скрипт, например 'subprocess.call (['7z'])' (он должен печатать 7z-справку) и 'os.isfile ('Test.7z ') '(это должно быть верно). Вам не нужен -mx9 на конце, но я думаю, что это в основном безвредно. – tdelaney

Смежные вопросы