Nano Hash - криптовалюты, майнинг, программирование

Создание zip-файла со сжатием в python с помощью модуля zipfile

Я новичок в питоне. Мое требование состоит в том, чтобы заархивировать (со сжатием) все файлы из исходного каталога в целевой каталог. Я использовал следующий код из stackOverFlow.

import zipfile, os
locfile = "D:\Python\Dir_dir\Dir_dir\ABC.txt"
loczip = "D:\Python\Dir_dir\Dir_dir2\ABC_TEST.zip"
zip = zipfile.ZipFile (loczip, "w")
zip.write (locfile)
zip.close()

Он создает zip-файл, но содержит всю унаследованную структуру каталогов. Кроме диска (D:/) остальная структура добавляется в zip. Он выглядит следующим образом: "D:\Python\Dir_dir\Dir_dir2\ABC_TEST.zip\Python\Dir_dir\Dir_dir\ABC.txt"

тогда как я хотел: "D:\Python\Dir_dir\Dir_dir2\ABC_TEST.zip\ABC.txt"

Также он не сжимается.

Пожалуйста, поделитесь решением этой проблемы.

Спасибо, Субрат.

22.08.2014

  • Ваш код не создает ZIP-файл, содержащий всю унаследованную структуру каталогов. В нем есть один файл с правильным путем Python\Dir_dir\Dir_dir (см. скриншот), поскольку имена архивных файлов должны указываться относительно корня архива, поэтому они не должны начинаться с разделителя пути (или буквы диска). Это находится в документации, поэтому я предлагаю вам дополнить чтение кода stackOverFlow просмотром этого. 22.08.2014
  • Кроме того, используйте необработанные строки или двойную обратную косую черту в именах путей Windows (добавьте r впереди, например r"D:\Python\Dir_dir\Dir_dir2\ABC_TEST.zip"). В противном случае Python будет преобразовывать такие последовательности, как '\t' и '\n', в табуляции и новые строки. 22.08.2014
  • Или просто используйте косую черту, это легко сделать, легко прочитать. 20.10.2017

Ответы:


1

Чтобы включить сжатие, укажите метод сжатия в конструкторе:

zip = zipfile.ZipFile(loczip, "w", zipfile.ZIP_DEFLATED)

Я думаю, вы просите удалить относительные пути файлов внутри zip-файла. Если вы действительно этого хотите, вы можете написать:

zip.write(locfile, os.path.basename(locfile))

Однако это, вероятно, плохая идея, поскольку удаление всей информации о пути приведет к конфликту имен, если вы заархивируете два файла с одинаковым именем.

22.08.2014
  • Полное удаление структуры каталогов файла, добавленного в архив, - это не то, чего хочет ОП. Вы также можете упомянуть, как вы организовали сжатие данных. 22.08.2014
  • @martineau - объяснил сжатие, как вы предложили 22.08.2014
  • os.path.basename(locfile) задает для имени файла в архиве просто 'ABC.txt' с удалением всей информации о пути. Это может быть нормально для файлов первого уровня в исходном каталоге, но если они есть в любых подпапках, это может быть проблемой. 22.08.2014
  • Мы интерпретируем, как я хотел: D:\Python\Dir_dir\Dir_dir2\ABC_TEST.zip\ABC.txt по-разному. Вы смотрели снимок экрана, который я сделал? 22.08.2014
  • @martineau - я переформулировал свой ответ, чтобы сделать мою интерпретацию вопроса более ясной и убедиться, что ОП понимает, почему это может быть проблемой. 22.08.2014

  • 2

    Ознакомьтесь с официальной документацией, и она четко решит ваши проблемы.

    ZipFile.write(filename, arcname=None, compress_type=None)
    

    сжатие должно быть одной из определенных констант, например, ZIP_DEFLATED

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

    В документацию также включено следующее примечание: Имена архивов должны указываться относительно корня архива, то есть они не должны начинаться с разделителя путей.

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

    22.08.2014
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..