पायथन में एक निर्देशिका का ज़िप संग्रह कैसे बनाएं?


490

मैं पायथन में निर्देशिका संरचना का ज़िप संग्रह कैसे बना सकता हूं?


21
स्वीकार किए जाते हैं जवाब में सुझाव दिया समाधान लेकिन एक और नीचे का उपयोग कर का उपयोग न करें make_archiveसे shutil(यदि आप रिकर्सिवली एकल निर्देशिका ज़िप करना चाहते)।
मलाना

जवाबों:


526

जैसा कि दूसरों ने बताया है, आपको जिपफाइल का उपयोग करना चाहिए । प्रलेखन आपको बताता है कि क्या कार्य उपलब्ध हैं, लेकिन वास्तव में यह स्पष्ट नहीं करता है कि आप पूरी निर्देशिका को ज़िप करने के लिए उनका उपयोग कैसे कर सकते हैं। मुझे लगता है कि कुछ उदाहरण कोड के साथ समझाना सबसे आसान है:

#!/usr/bin/env python
import os
import zipfile

def zipdir(path, ziph):
    # ziph is zipfile handle
    for root, dirs, files in os.walk(path):
        for file in files:
            ziph.write(os.path.join(root, file))

if __name__ == '__main__':
    zipf = zipfile.ZipFile('Python.zip', 'w', zipfile.ZIP_DEFLATED)
    zipdir('tmp/', zipf)
    zipf.close()

से अनुकूलित: http://www.devshed.com/c/a/Python/Python-UnZipped/


129
मैं लेखन कॉल में एक दूसरा तर्क जोड़ूंगा, पासिंग os.path.relpath(os.path.join(root, file), os.path.join(path, '..'))। यह आपको संग्रह में पूर्ण निरपेक्ष पथ प्राप्त किए बिना, किसी भी कार्यशील निर्देशिका से एक निर्देशिका को ज़िप करने देगा।
रीमुंड

8
जब मैं किसी फ़ोल्डर को ज़िप करने की कोशिश करता हूं और परिणामी ज़िप को उसी फ़ोल्डर में आउटपुट करने की कोशिश करता है, तो एक अजीब पुनरावृत्ति होती है। :-)
सिब्ब्स जुआ

13
shutilयह सिर्फ एक लाइन में वास्तव में आसान बनाता है। कृपया नीचे दिए गए उत्तर की जाँच करें ..
droidlabour

7
आप ziph.write (os.path.join (पथ, फ़ाइल), arcname = फ़ाइल) करके अधिक रुचि रख सकते हैं ताकि संग्रह के अंदर फ़ाइल नाम हार्ड ड्राइव के सापेक्ष न हों
Christophe Blin

1
आह, मुझे .close()फोन याद आ रहा था !
information_interchange

1060

उपयोग करने का सबसे आसान तरीका है shutil.make_archive। यह ज़िप और टार दोनों स्वरूपों का समर्थन करता है।

import shutil
shutil.make_archive(output_filename, 'zip', dir_name)

यदि आपको पूरी निर्देशिका (जैसे कि कुछ फ़ाइलों को छोड़ना) की अपेक्षा कुछ अधिक जटिल करने की आवश्यकता है, तो आपको zipfileमॉड्यूल में खुदाई करने की आवश्यकता होगी जैसा कि अन्य ने सुझाव दिया है।


113
shutilमानक अजगर पुस्तकालय का हिस्सा है। यह शीर्ष उत्तर होना चाहिए
एलेक्सगॉन

4
यह यहां सबसे संक्षिप्त उत्तर है और संग्रह में सभी उपनिर्देशिकाओं और फ़ाइलों को सीधे जोड़ने का लाभ है, बजाय एक शीर्ष-स्तरीय फ़ोल्डर में सब कुछ शामिल करने के बजाय (जिसके परिणामस्वरूप फ़ोल्डर की संरचना में एक अनावश्यक स्तर हो जाता है)।
ऐच-हेट

3
@ cmcginty क्या आप थोड़ा अधिक विशिष्ट हो सकते हैं क्योंकि इसका कौन सा पहलू धागा-सुरक्षित नहीं है? क्या कई थ्रेड चलेंगे जबकि एक कॉल करने से दुभाषिया दुर्घटनाग्रस्त हो जाएगा?
std''OrgnlDave

13
आगाह किया कि पायथन 3.4 से पहले, shutil.make_archive ZIP64 का समर्थन नहीं करता है और 2GB से बड़ी ज़िप फ़ाइलों को बनाने में विफल रहेगा।
अज़देव

2
@Teekin No. यदि आप बग रिपोर्ट (Bugs.python.org/issue30511) को देखते हैं, तो आपको वह shutil.make_archiveउपयोग दिखाई देगा os.chdir()। मैं जिस बारे में पढ़ रहा हूं os.chdir(), वह विश्व स्तर पर चल रही है।
सैम मलयेक

65

mydirectoryसभी फ़ाइलों और उपनिर्देशिकाओं सहित एक नई ज़िप फ़ाइल की सामग्री को जोड़ने के लिए :

import os
import zipfile

zf = zipfile.ZipFile("myzipfile.zip", "w")
for dirname, subdirs, files in os.walk("mydirectory"):
    zf.write(dirname)
    for filename in files:
        zf.write(os.path.join(dirname, filename))
zf.close()

मेरे लिए यह कोड त्रुटि के नीचे फेंक रहा है TypeError: अमान्य फ़ाइल: <zipfile.ZipFile [बंद]>
निषाद

10
क्या आप अपने आप को अंत में withकॉल करने के बजाय उपयोग नहीं कर सकते close()?
आर्टऑफवर्फ

50

मैं पायथन में निर्देशिका संरचना का ज़िप संग्रह कैसे बना सकता हूं?

एक पायथन लिपि में

पायथन 2.7+ में, shutilएक make_archiveफ़ंक्शन है।

from shutil import make_archive
make_archive(
  'zipfile_name', 
  'zip',           # the archive format - or tar, bztar, gztar 
  root_dir=None,   # root for archive - current working dir if None
  base_dir=None)   # start archiving from here - cwd if None too

यहां ज़िप्ड आर्काइव का नाम दिया जाएगा zipfile_name.zip। यदि इससे base_dirनीचे की ओर root_dirहै, तो उन फ़ाइलों को शामिल नहीं किया जाएगा base_dir, लेकिन फिर भी माता-पिता की फ़ाइलों को संग्रहित किया जा सकता है root_dir

मैं 2.7 के साथ Cygwin पर इस मुद्दे का परीक्षण किया था - यह cwd के लिए एक root_dir तर्क चाहता है:

make_archive('zipfile_name', 'zip', root_dir='.')

शेल्थन से पायथन का उपयोग करना

आप zipfileमॉड्यूल का उपयोग करके शेल से अजगर के साथ भी ऐसा कर सकते हैं :

$ python -m zipfile -c zipname sourcedir

zipnameआपके द्वारा इच्छित गंतव्य फ़ाइल का नाम कहां है ( .zipयदि आप चाहते हैं, तो वह इसे स्वचालित रूप से नहीं करेगा) और sourcedir निर्देशिका का पथ है।

अजगर को ज़िप करना (या सिर्फ माता-पिता की इच्छा नहीं है):

आप एक साथ एक अजगर पैकेज ज़िप करना चाहते हैं तो __init__.pyऔर __main__.py, और आप माता-पिता dir नहीं करना चाहते, यह है

$ python -m zipfile -c zipname sourcedir/*

तथा

$ python zipname

पैकेज चलाएगा। (ध्यान दें कि आप ज़िप किए गए संग्रह से प्रविष्टि बिंदु के रूप में उप-पैकेज नहीं चला सकते हैं।)

अजगर ऐप को छोड़ना:

यदि आपके पास python3.5 + है, और विशेष रूप से पायथन पैकेज को ज़िप करना चाहते हैं, तो zipapp का उपयोग करें :

$ python -m zipapp myapp
$ python myapp.pyz

31

यह फ़ंक्शन रीसर्च्युली डायरेक्टरी ट्री को ज़िप करेगा, फाइल्स को कंप्रेस करेगा और आर्काइव में सही रिलेटिव फाइलनाम रिकॉर्ड करेगा। आर्काइव प्रविष्टियाँ उसी के द्वारा उत्पन्न होती हैं zip -r output.zip source_dir

import os
import zipfile
def make_zipfile(output_filename, source_dir):
    relroot = os.path.abspath(os.path.join(source_dir, os.pardir))
    with zipfile.ZipFile(output_filename, "w", zipfile.ZIP_DEFLATED) as zip:
        for root, dirs, files in os.walk(source_dir):
            # add directory (needed for empty dirs)
            zip.write(root, os.path.relpath(root, relroot))
            for file in files:
                filename = os.path.join(root, file)
                if os.path.isfile(filename): # regular files only
                    arcname = os.path.join(os.path.relpath(root, relroot), file)
                    zip.write(filename, arcname)

17

शेटिल का उपयोग करें, जो कि पायथन मानक पुस्तकालय सेट का हिस्सा है। शटील का उपयोग करना इतना सरल है (नीचे कोड देखें):

  • पहला arg: परिणामी ज़िप / फ़ाइल का नाम फ़ाइल,
  • दूसरा arg: zip / tar,
  • तीसरा arg: dir_name

कोड:

import shutil
shutil.make_archive('/home/user/Desktop/Filename','zip','/home/username/Desktop/Directory')

12

परिणामी ज़िप फ़ाइल में संपीड़न जोड़ने के लिए, इस लिंक को देखें

आपको बदलने की आवश्यकता है:

zip = zipfile.ZipFile('Python.zip', 'w')

सेवा

zip = zipfile.ZipFile('Python.zip', 'w', zipfile.ZIP_DEFLATED)

5

मैंने मार्क बायर्स द्वारा दिए गए कोड में कुछ बदलाव किए हैं । यदि आपके पास है तो नीचे दी गई फ़ंक्शन भी खाली निर्देशिकाओं को जोड़ेगी। उदाहरणों को यह अधिक स्पष्ट करना चाहिए कि ज़िप में जोड़ा गया मार्ग क्या है।

#!/usr/bin/env python
import os
import zipfile

def addDirToZip(zipHandle, path, basePath=""):
    """
    Adding directory given by \a path to opened zip file \a zipHandle

    @param basePath path that will be removed from \a path when adding to archive

    Examples:
        # add whole "dir" to "test.zip" (when you open "test.zip" you will see only "dir")
        zipHandle = zipfile.ZipFile('test.zip', 'w')
        addDirToZip(zipHandle, 'dir')
        zipHandle.close()

        # add contents of "dir" to "test.zip" (when you open "test.zip" you will see only it's contents)
        zipHandle = zipfile.ZipFile('test.zip', 'w')
        addDirToZip(zipHandle, 'dir', 'dir')
        zipHandle.close()

        # add contents of "dir/subdir" to "test.zip" (when you open "test.zip" you will see only contents of "subdir")
        zipHandle = zipfile.ZipFile('test.zip', 'w')
        addDirToZip(zipHandle, 'dir/subdir', 'dir/subdir')
        zipHandle.close()

        # add whole "dir/subdir" to "test.zip" (when you open "test.zip" you will see only "subdir")
        zipHandle = zipfile.ZipFile('test.zip', 'w')
        addDirToZip(zipHandle, 'dir/subdir', 'dir')
        zipHandle.close()

        # add whole "dir/subdir" with full path to "test.zip" (when you open "test.zip" you will see only "dir" and inside it only "subdir")
        zipHandle = zipfile.ZipFile('test.zip', 'w')
        addDirToZip(zipHandle, 'dir/subdir')
        zipHandle.close()

        # add whole "dir" and "otherDir" (with full path) to "test.zip" (when you open "test.zip" you will see only "dir" and "otherDir")
        zipHandle = zipfile.ZipFile('test.zip', 'w')
        addDirToZip(zipHandle, 'dir')
        addDirToZip(zipHandle, 'otherDir')
        zipHandle.close()
    """
    basePath = basePath.rstrip("\\/") + ""
    basePath = basePath.rstrip("\\/")
    for root, dirs, files in os.walk(path):
        # add dir itself (needed for empty dirs
        zipHandle.write(os.path.join(root, "."))
        # add files
        for file in files:
            filePath = os.path.join(root, file)
            inZipPath = filePath.replace(basePath, "", 1).lstrip("\\/")
            #print filePath + " , " + inZipPath
            zipHandle.write(filePath, inZipPath)

ऊपर एक सरल कार्य है जिसे सरल मामलों के लिए काम करना चाहिए। आप मेरे Gist में अधिक सुरुचिपूर्ण वर्ग पा सकते हैं: https://gist.github.com/Eccenux/17526123107ca0ac28e6


1
Os.path का उपयोग करके पथ हैंडलिंग को बहुत सरल बनाया जा सकता है । मेरा जवाब देखिए।
जॉर्ज वी। रेली

बग: zipHandle.write (os.path.join (रूट, "।")) बेसपैथ को ध्यान में नहीं रखता है।
पेट्टर

हां, आप शायद सही हैं। मैंने बाद में इसे थोड़ा बदल दिया है ;-) gist.github.com/Eccenux/17526123107ca0ac28e6
Nux

4

आधुनिक पायथन (3.6+) pathlibसंक्षिप्त ओओपी-जैसे पथों के संचालन के pathlib.Path.rglob()लिए और पुनरावर्ती ग्लोबबिंग के लिए मॉड्यूल का उपयोग कर रहा है । जहां तक ​​मैं बता सकता हूं, यह जॉर्ज वी। रेली के जवाब के बराबर है: संपीड़न के साथ ज़िप, सबसे ऊपरी तत्व एक निर्देशिका है, खाली डायर रखता है, रिश्तेदार रास्तों का उपयोग करता है।

from pathlib import Path
from zipfile import ZIP_DEFLATED, ZipFile

from os import PathLike
from typing import Union


def zip_dir(zip_name: str, source_dir: Union[str, PathLike]):
    src_path = Path(source_dir).expanduser().resolve(strict=True)
    with ZipFile(zip_name, 'w', ZIP_DEFLATED) as zf:
        for file in src_path.rglob('*'):
            zf.write(file, file.relative_to(src_path.parent))

नोट: जैसा कि वैकल्पिक प्रकार संकेत इंगित करते हैं, zip_nameएक पथ ऑब्जेक्ट नहीं हो सकता है ( 3.6.2+ में तय किया जाएगा )।


1
बहुत खुबस! संक्षिप्त! आधुनिक!
ingyhere

3

मेरे पास एक और कोड उदाहरण है जो python3, pathlib और zipfile का उपयोग करके मदद कर सकता है। यह किसी भी ओएस में काम करना चाहिए।

from pathlib import Path
import zipfile
from datetime import datetime

DATE_FORMAT = '%y%m%d'


def date_str():
    """returns the today string year, month, day"""
    return '{}'.format(datetime.now().strftime(DATE_FORMAT))


def zip_name(path):
    """returns the zip filename as string"""
    cur_dir = Path(path).resolve()
    parent_dir = cur_dir.parents[0]
    zip_filename = '{}/{}_{}.zip'.format(parent_dir, cur_dir.name, date_str())
    p_zip = Path(zip_filename)
    n = 1
    while p_zip.exists():
        zip_filename = ('{}/{}_{}_{}.zip'.format(parent_dir, cur_dir.name,
                                             date_str(), n))
        p_zip = Path(zip_filename)
        n += 1
    return zip_filename


def all_files(path):
    """iterator returns all files and folders from path as absolute path string
    """
    for child in Path(path).iterdir():
        yield str(child)
        if child.is_dir():
            for grand_child in all_files(str(child)):
                yield str(Path(grand_child))


def zip_dir(path):
    """generate a zip"""
    zip_filename = zip_name(path)
    zip_file = zipfile.ZipFile(zip_filename, 'w')
    print('create:', zip_filename)
    for file in all_files(path):
        print('adding... ', file)
        zip_file.write(file)
    zip_file.close()


if __name__ == '__main__':
    zip_dir('.')
    print('end!')

1

आप शायद zipfileमॉड्यूल को देखना चाहते हैं ; http://docs.python.org/library/zipfile.html पर प्रलेखन है ।

आप os.walk()निर्देशिका संरचना को अनुक्रमित करना भी चाह सकते हैं ।


1

यहाँ Nux द्वारा दिए गए उत्तर पर एक भिन्नता है जो मेरे लिए काम करती है:

def WriteDirectoryToZipFile( zipHandle, srcPath, zipLocalPath = "", zipOperation = zipfile.ZIP_DEFLATED ):
    basePath = os.path.split( srcPath )[ 0 ]
    for root, dirs, files in os.walk( srcPath ):
        p = os.path.join( zipLocalPath, root [ ( len( basePath ) + 1 ) : ] )
        # add dir
        zipHandle.write( root, p, zipOperation )
        # add files
        for f in files:
            filePath = os.path.join( root, f )
            fileInZipPath = os.path.join( p, f )
            zipHandle.write( filePath, fileInZipPath, zipOperation )

1

नीचे एक कोशिश करो। यह मेरे लिए काम किया

import zipfile, os
zipf = "compress.zip"  
def main():
    directory = r"Filepath"
    toZip(directory)
def toZip(directory):
    zippedHelp = zipfile.ZipFile(zipf, "w", compression=zipfile.ZIP_DEFLATED )

    list = os.listdir(directory)
    for file_list in list:
        file_name = os.path.join(directory,file_list)

        if os.path.isfile(file_name):
            print file_name
            zippedHelp.write(file_name)
        else:
            addFolderToZip(zippedHelp,file_list,directory)
            print "---------------Directory Found-----------------------"
    zippedHelp.close()

def addFolderToZip(zippedHelp,folder,directory):
    path=os.path.join(directory,folder)
    print path
    file_list=os.listdir(path)
    for file_name in file_list:
        file_path=os.path.join(path,file_name)
        if os.path.isfile(file_path):
            zippedHelp.write(file_path)
        elif os.path.isdir(file_name):
            print "------------------sub directory found--------------------"
            addFolderToZip(zippedHelp,file_name,path)


if __name__=="__main__":
    main()

1

यदि आप किसी सामान्य ग्राफ़िकल फ़ाइल प्रबंधक के कंप्रेस फ़ोल्डर जैसी कार्यक्षमता चाहते हैं, तो आप निम्न कोड का उपयोग कर सकते हैं, यह zipfile मॉड्यूल का उपयोग करता है । इस कोड का उपयोग करके आपके पास रूट रूट फ़ोल्डर के रूप में ज़िप फ़ाइल होगी।

import os
import zipfile

def zipdir(path, ziph):
    # Iterate all the directories and files
    for root, dirs, files in os.walk(path):
        # Create a prefix variable with the folder structure inside the path folder. 
        # So if a file is at the path directory will be at the root directory of the zip file
        # so the prefix will be empty. If the file belongs to a containing folder of path folder 
        # then the prefix will be that folder.
        if root.replace(path,'') == '':
                prefix = ''
        else:
                # Keep the folder structure after the path folder, append a '/' at the end 
                # and remome the first character, if it is a '/' in order to have a path like 
                # folder1/folder2/file.txt
                prefix = root.replace(path, '') + '/'
                if (prefix[0] == '/'):
                        prefix = prefix[1:]
        for filename in files:
                actual_file_path = root + '/' + filename
                zipped_file_path = prefix + filename
                zipf.write( actual_file_path, zipped_file_path)


zipf = zipfile.ZipFile('Python.zip', 'w', zipfile.ZIP_DEFLATED)
zipdir('/tmp/justtest/', zipf)
zipf.close()

1

अधिक लचीलापन देने के लिए, नाम के उपयोग द्वारा निर्देशिका / फ़ाइल चुनें:

import os
import zipfile

def zipall(ob, path, rel=""):
    basename = os.path.basename(path)
    if os.path.isdir(path):
        if rel == "":
            rel = basename
        ob.write(path, os.path.join(rel))
        for root, dirs, files in os.walk(path):
            for d in dirs:
                zipall(ob, os.path.join(root, d), os.path.join(rel, d))
            for f in files:
                ob.write(os.path.join(root, f), os.path.join(rel, f))
            break
    elif os.path.isfile(path):
        ob.write(path, os.path.join(rel, basename))
    else:
        pass

एक फ़ाइल ट्री के लिए:

.
├── dir
   ├── dir2
      └── file2.txt
   ├── dir3
      └── file3.txt
   └── file.txt
├── dir4
   ├── dir5
   └── file4.txt
├── listdir.zip
├── main.py
├── root.txt
└── selective.zip

आप उदाहरण के लिए केवल dir4और का चयन कर सकते हैं root.txt:

cwd = os.getcwd()
files = [os.path.join(cwd, f) for f in ['dir4', 'root.txt']]

with zipfile.ZipFile("selective.zip", "w" ) as myzip:
    for f in files:
        zipall(myzip, f)

या बस listdirस्क्रिप्ट मंगलाचरण निर्देशिका में और वहाँ से सब कुछ जोड़ें:

with zipfile.ZipFile("listdir.zip", "w" ) as myzip:
    for f in os.listdir():
        if f == "listdir.zip":
            # Creating a listdir.zip in the same directory
            # will include listdir.zip inside itself, beware of this
            continue
        zipall(myzip, f)

यह ज़िप करता है, लेकिन संपीड़ित नहीं करता है।
एलेक्स

1

आप वर्तमान निर्देशिका में सभी फ़ोल्डर्स (उप निर्देशिका) को ज़िप करना चाहते हैं।

for root, dirs, files in os.walk("."):
    for sub_dir in dirs:
        zip_you_want = sub_dir+".zip"
        zip_process = zipfile.ZipFile(zip_you_want, "w", zipfile.ZIP_DEFLATED)
        zip_process.write(file_you_want_to_include)
        zip_process.close()

        print("Successfully zipped directory: {sub_dir}".format(sub_dir=sub_dir))

1

पैरेंट डायरेक्टरी के तहत फ़ोल्डर पदानुक्रम को बनाए रखने के संक्षिप्त तरीके के लिए संग्रहीत किया जाना चाहिए:

import glob
import zipfile

with zipfile.ZipFile(fp_zip, "w", zipfile.ZIP_DEFLATED) as zipf:
    for fp in glob(os.path.join(parent, "**/*")):
        base = os.path.commonpath([parent, fp])
        zipf.write(fp, arcname=fp.replace(base, ""))

यदि आप चाहें, तो आप इसे pathlib फ़ाइल ग्लोबिंग के लिए उपयोग करने के लिए बदल सकते हैं ।


1

यहाँ बहुत सारे उत्तर, और मुझे आशा है कि मैं अपने स्वयं के संस्करण के साथ योगदान कर सकता हूं, जो मूल उत्तर पर आधारित है (वैसे), लेकिन अधिक आलेखीय परिप्रेक्ष्य के साथ, प्रत्येक zipfileसेटअप के लिए संदर्भ का उपयोग करना और क्रमबद्ध करना os.walk(), ताकि एक उत्पादन का आदेश दिया।

इन फ़ोल्डरों और उन्हें फ़ाइलों (अन्य फ़ोल्डरों के बीच) के बाद, मैं .zipप्रत्येक cap_फ़ोल्डर के लिए बनाना चाहता था :

$ tree -d
.
├── cap_01
|    ├── 0101000001.json
|    ├── 0101000002.json
|    ├── 0101000003.json
|
├── cap_02
|    ├── 0201000001.json
|    ├── 0201000002.json
|    ├── 0201001003.json
|
├── cap_03
|    ├── 0301000001.json
|    ├── 0301000002.json
|    ├── 0301000003.json
| 
├── docs
|    ├── map.txt
|    ├── main_data.xml
|
├── core_files
     ├── core_master
     ├── core_slave

इस प्रक्रिया की बेहतर समझ के लिए टिप्पणियों के साथ मैंने यहां आवेदन किया है।

$ cat zip_cap_dirs.py 
""" Zip 'cap_*' directories. """           
import os                                                                       
import zipfile as zf                                                            


for root, dirs, files in sorted(os.walk('.')):                                                                                               
    if 'cap_' in root:                                                          
        print(f"Compressing: {root}")                                           
        # Defining .zip name, according to Capítulo.                            
        cap_dir_zip = '{}.zip'.format(root)                                     
        # Opening zipfile context for current root dir.                         
        with zf.ZipFile(cap_dir_zip, 'w', zf.ZIP_DEFLATED) as new_zip:          
            # Iterating over os.walk list of files for the current root dir.    
            for f in files:                                                     
                # Defining relative path to files from current root dir.        
                f_path = os.path.join(root, f)                                  
                # Writing the file on the .zip file of the context              
                new_zip.write(f_path) 

मूल रूप से, प्रत्येक पुनरावृत्ति के लिए os.walk(path), मैं zipfileसेटअप के लिए एक संदर्भ खोल रहा हूं और बाद में, पुनरावृति से अधिक पुनरावृत्ति कर रहा हूं files, जो निर्देशिका listसे फ़ाइलों की एक है root, वर्तमान rootनिर्देशिका के आधार पर प्रत्येक फ़ाइल के लिए सापेक्ष पथ का निर्माण करते हुए , zipfileजो संदर्भ चल रहा है। ।

और आउटपुट इस तरह प्रस्तुत किया जाता है:

$ python3 zip_cap_dirs.py
Compressing: ./cap_01
Compressing: ./cap_02
Compressing: ./cap_03

प्रत्येक .zipनिर्देशिका की सामग्री को देखने के लिए , आप lessकमांड का उपयोग कर सकते हैं :

$ less cap_01.zip

Archive:  cap_01.zip
 Length   Method    Size  Cmpr    Date    Time   CRC-32   Name
--------  ------  ------- ---- ---------- ----- --------  ----
  22017  Defl:N     2471  89% 2019-09-05 08:05 7a3b5ec6  cap_01/0101000001.json
  21998  Defl:N     2471  89% 2019-09-05 08:05 155bece7  cap_01/0101000002.json
  23236  Defl:N     2573  89% 2019-09-05 08:05 55fced20  cap_01/0101000003.json
--------          ------- ---                           -------
  67251             7515  89%                            3 files

0

यहां पाथलीब और एक संदर्भ प्रबंधक का उपयोग करते हुए एक आधुनिक दृष्टिकोण है। फ़ाइलों को ज़िप में सीधे रखता है, बजाय सबफ़ोल्डर में।

def zip_dir(filename: str, dir_to_zip: pathlib.Path):
    with zipfile.ZipFile(filename, 'w', zipfile.ZIP_DEFLATED) as zipf:
        # Use glob instead of iterdir(), to cover all subdirectories.
        for directory in dir_to_zip.glob('**'):
            for file in directory.iterdir():
                if not file.is_file():
                    continue
                # Strip the first component, so we don't create an uneeded subdirectory
                # containing everything.
                zip_path = pathlib.Path(*file.parts[1:])
                # Use a string, since zipfile doesn't support pathlib  directly.
                zipf.write(str(file), str(zip_path))

0

मैंने रीमंड और मोर्टन ज़िलर की टिप्पणियों (सापेक्ष पथ और खाली निर्देशिकाओं सहित) के साथ मार्क बायर्स के समाधान को समेकित करके एक समारोह तैयार किया। एक सर्वोत्तम अभ्यास के रूप में,with रूप में, ZipFile के फ़ाइल निर्माण में उपयोग किया जाता है।

फ़ंक्शन ज़िप्ड निर्देशिका नाम और '। ज़िप' एक्सटेंशन के साथ एक डिफ़ॉल्ट ज़िप फ़ाइल नाम भी तैयार करता है। इसलिए, यह केवल एक तर्क के साथ काम करता है: स्रोत निर्देशिका को ज़िप किया जाना है।

import os
import zipfile

def zip_dir(path_dir, path_file_zip=''):
if not path_file_zip:
    path_file_zip = os.path.join(
        os.path.dirname(path_dir), os.path.basename(path_dir)+'.zip')
with zipfile.ZipFile(path_file_zip, 'wb', zipfile.ZIP_DEFLATED) as zip_file:
    for root, dirs, files in os.walk(path_dir):
        for file_or_dir in files + dirs:
            zip_file.write(
                os.path.join(root, file_or_dir),
                os.path.relpath(os.path.join(root, file_or_dir),
                                os.path.join(path_dir, os.path.pardir)))

0
# import required python modules
# You have to install zipfile package using pip install

import os,zipfile

# Change the directory where you want your new zip file to be

os.chdir('Type your destination')

# Create a new zipfile ( I called it myfile )

zf = zipfile.ZipFile('myfile.zip','w')

# os.walk gives a directory tree. Access the files using a for loop

for dirnames,folders,files in os.walk('Type your directory'):
    zf.write('Type your Directory')
    for file in files:
        zf.write(os.path.join('Type your directory',file))

0

खैर, सुझावों को पढ़ने के बाद मैं बहुत ही समान तरीके से आया, जो "अजीब" निर्देशिका नाम (पूर्ण-समान नाम) बनाए बिना 2.7.x के साथ काम करता है, और केवल ज़िप के अंदर निर्दिष्ट फ़ोल्डर बना देगा।

या बस के मामले में आप अपने ज़िप की जरूरत है चयनित निर्देशिका की सामग्री के साथ एक फ़ोल्डर के अंदर।

def zipDir( path, ziph ) :
 """
 Inserts directory (path) into zipfile instance (ziph)
 """
 for root, dirs, files in os.walk( path ) :
  for file in files :
   ziph.write( os.path.join( root, file ) , os.path.basename( os.path.normpath( path ) ) + "\\" + file )

def makeZip( pathToFolder ) :
 """
 Creates a zip file with the specified folder
 """
 zipf = zipfile.ZipFile( pathToFolder + 'file.zip', 'w', zipfile.ZIP_DEFLATED )
 zipDir( pathToFolder, zipf )
 zipf.close()
 print( "Zip file saved to: " + pathToFolder)

makeZip( "c:\\path\\to\\folder\\to\\insert\\into\\zipfile" )

0

ज़िप फ़ाइल बनाने का कार्य।

def CREATEZIPFILE(zipname, path):
    #function to create a zip file
    #Parameters: zipname - name of the zip file; path - name of folder/file to be put in zip file

    zipf = zipfile.ZipFile(zipname, 'w', zipfile.ZIP_DEFLATED)
    zipf.setpassword(b"password") #if you want to set password to zipfile

    #checks if the path is file or directory
    if os.path.isdir(path):
        for files in os.listdir(path):
            zipf.write(os.path.join(path, files), files)

    elif os.path.isfile(path):
        zipf.write(os.path.join(path), path)
    zipf.close()

कृपया एक उदाहरण के साथ समझाएं ताकि मैं अपने उत्तर को सही कर
सकूं

हालांकि, zipfile (से "वर्तमान में एक एन्क्रिप्टेड फ़ाइल नहीं बना सकते" docs.python.org/3.9/library/zipfile.html )
जोर्ज

0

Zipfly का उपयोग करना

import zipfly

paths = [
    {
        'fs': '/path/to/large/file'
    },
]

zfly = zipfly.ZipFly( paths = paths )

with open("large.zip", "wb") as f:
    for i in zfly.generator():
        f.write(i)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.