2015-03-20 2 views
0

Как получить имя локального файла после запуска ZipFile extract()?Получить локальное имя файла после ZipFile extract()

Когда я делаю это:

with zipfile.ZipFile(localZipFilePath, "r") as zf: 
     for name in zf.namelist(): 
      localFilePath = zf.extract(name, '/tmp/') 
      print localFilePath 

файл, как он существует в файле почтового индекса является: src/xyz/somefile.txt

localFilePath выводит это: /tmp/src

Файл, здесь написано: /tmp/src/xyz/somefile.txt и это то, что я хотел бы получить изящным способом.

+0

Нет, 'localFilePath' фактическое целевое имя, что файл записывается, или путь к каталогу, если присутствует в ZipFile. Нет необходимости дополнительно обрабатывать возвращаемое значение. –

+0

@MartijnPieters - это не то, что я вижу. Я посмотрел исходный код для ZipFile и вижу, что он никогда не возвращает полный путь к файлу (полный путь с именем файла). Я прошу изящный способ получить полный путь с именем файла. Кроме того, в вашем комментарии неясно, что вы говорите «Нет». –

+0

Я также проверил исходный код, и я ясно вижу, что ['targetpath' - это то, что создается локально, а затем возвращено] (https://hg.python.org/cpython/file/447794596266/Lib/zipfile.py # l1077). –

ответ

3

Я думаю, вы что-то неправильно поняли. ZipFile.extract() method всегда возвращает либо полный путь к каталогу, либо файлу, созданному для этого конкретного члена zipfile.

В документации не указывается, это явно, source code for the method совершенно ясно здесь:

if member.filename[-1] == '/': 
    if not os.path.isdir(targetpath): 
     os.mkdir(targetpath) 
    return targetpath 

with self.open(member, pwd=pwd) as source, \ 
    file(targetpath, "wb") as target: 
    shutil.copyfileobj(source, target) 

return targetpath 

Так как имя файла члена заканчивается в / (каталог), в этом случае создается каталог, или файл создается с копируемыми данными. В любом случае, targetpath - это локальный путь только что созданной записи файловой системы.

У меня есть opened a Python issue, чтобы обновить документацию; по состоянию на 2015-03-15 обновленная документация обновлена ​​следующим образом:

Возвращает нормализованный путь (каталог или новый файл).

+0

Я даю это Мартиджину, потому что он определил мое непонимание кода python. Extra at-a-boys, если он изменяет документацию python;). –

+0

@MichaelPotter: У меня есть эта закладка, чтобы подать вопрос, да. :-) –

0

Коренная проблема заключалась в том, что я не учитывал, что папки являются частью zip-файла. Мой код был разработан только для обработки файлов.

Я установил свой код, добавив, если заявление для обнаружения папки:

with zipfile.ZipFile(localZipFilePath, "r") as zf: 
     for name in zf.namelist(): 
      localFilePath = zf.extract(name, '/tmp/') 
      if os.path.isdir(localFilePath): 
       continue 
      print localFilePath 
Смежные вопросы