Top

pyMez.Code.DataHandlers.ZipModels module

ZipModels holds classes and functions for manipulating zip files. A zipped archive is represented by the class ZipArchive, you can open an existing file and extract_all, show the files contained zip_file.files or add files on disk, full directories, or strings as files.

Examples

>> from pyMez import *
>> zip_file=ZipArchive()
>> zip_file.add_file(os.path.join(TESTS_DIRECTORY,"test.png"))
>> zip_file.save(os.path.join(TESTS_DIRECTORY,"test.zip")

ZipModels Example

Help

pyMez.Code.DataHandlers

Documentation Home | API Documentation Home | Index of all Functions and Classes in pyMez

#-----------------------------------------------------------------------------
# Name:        ZipModels
# Purpose:     To hold functions and models for compressed archives
# Author:      Aric Sanders
# Created:     9/15/2016
# License:     MIT License
#-----------------------------------------------------------------------------
"""
ZipModels holds classes and functions for manipulating zip files. A zipped archive is represented
by the class ZipArchive, you can open an existing file and extract_all, show the files contained zip_file.files
or add files on disk, full directories, or strings as files.

Examples
--------
    #!python
    >> from pyMez import *
    >> zip_file=ZipArchive()
    >> zip_file.add_file(os.path.join(TESTS_DIRECTORY,"test.png"))
    >> zip_file.save(os.path.join(TESTS_DIRECTORY,"test.zip")

<a href="../../../Examples/Html/ZipModels_Example.html">ZipModels Example</a>

Help
---------------
<a href="./index.html">`pyMez.Code.DataHandlers`</a>
<div>
<a href="../../../pyMez_Documentation.html">Documentation Home</a> |
<a href="../../index.html">API Documentation Home</a> |
<a href="../../../Reference_Index.html">Index of all Functions and Classes in pyMez</a>
</div>
"""

#-----------------------------------------------------------------------------
# Standard Imports
import sys
import os
import zipfile
import shutil

#-----------------------------------------------------------------------------
# Third Party Imports
sys.path.append(os.path.join(os.path.dirname( __file__ ), '..','..'))
try:
    from Code.Utils.Names import auto_name
except:
    print("The function auto_name in pyMez.Code.Utils.Names was not found or had an error")
    raise
#-----------------------------------------------------------------------------
# Module Constants

#-----------------------------------------------------------------------------
# Module Functions
def add_all_files(zipfile,top_directory):
    """Adds all of the files under top directory into the zipfile and closes the file"""
    for directory, dirnames, filenames in os.walk(top_directory):
        for filename in filenames:
            zipfile.write(os.path.join(directory,filename),
                          os.path.join(os.path.relpath(directory,top_directory),filename))

def extract_all(zipfile,directory):
    """Extracts all files from the zip archive to the specified directory"""
    zipfile.extractall(directory)
#-----------------------------------------------------------------------------
# Module Classes
class ZipArchive():
    """A container for zipped files, provides the ability to open, add files to, extract files from
    and save zip archives.
        !#python
        defaults={"specific_descriptor":'Data',
                  "general_descriptor":'Archive',
                  "directory":None,
                  "extension":'zip',
                  "temp_directory":None,
                  "name":None,
                  "path":None,
                  "files":None}        """
    def __init__(self,file_path=None,**options):
        " Initializes the ZipArchive class "
        # This is a general pattern for adding a lot of options some with defaults
        defaults={"specific_descriptor":'Data',
                  "general_descriptor":'Archive',
                  "directory":None,
                  "extension":'zip',
                  "temp_directory":None,
                  "name":None,
                  "path":None,
                  "files":None}
        self.options={}
        for key,value in defaults.items():
            self.options[key]=value
        for key,value in options.items():
            self.options[key]=value
        if file_path is None:
            if self.options["path"] is None:
                self.name=auto_name(self.options["specific_descriptor"],
                                    self.options["general_descriptor"],
                                    self.options["directory"],
                                    self.options["extension"])
                if self.options['directory'] is None:
                    self.path=self.name
                else:
                    self.path=os.path.join(self.options["directory"],self.name)
            else:
                self.path=self.options["path"]
            self.zip_file=zipfile.ZipFile(self.path,'w')
            if self.options["files"] is not None:
                for file_name in self.options["files"]:
                    self.zip_file.write(file_name,os.path.split(file_name)[1])
        else:
            self.zip_file=zipfile.ZipFile(file_path,'a')
        self.files=self.zip_file.namelist()

    def save(self,path=None,**save_options):
        """Saves the file to path"""
        if path is None:
            pass
        else:
            if not self.options["temp_directory"]:
                try:
                    os.mkdir("./Temp")
                except:
                    pass
                self.options["temp_directory"]="./Temp"
            temp_path=os.path.join(self.options["temp_directory"],"temp_file")
            temp_extracted=extract_all(self.zip_file,temp_path)
            temp_zip=zipfile.ZipFile(path,'w')
            add_all_files(temp_zip,temp_path)
            # need to delete the temp folder
            shutil.rmtree(temp_path)
            temp_zip.close()


    def extract_all(self,destination_directory=None):
        """Extract all in the destination directory (default is current working directory)"""
        if destination_directory is None:
            destination_directory=os.getcwd()
        extract_all(self.zip_file,destination_directory)

    def add_all_from_directory(self,directory=None):
        """Adds all files in the directory"""
        if directory is None:
            directory=os.getcwd()
        add_all_files(self.zip_file,directory)
        self.files=self.zip_file.namelist()

    def add_file(self,file_path,archive_name=None):
        """Adds the file specified by file_path to the zip archive"""
        if archive_name is None:
            archive_name=os.path.split(file_path)[1]
        self.zip_file.write(file_path,archive_name)
        self.files=self.zip_file.namelist()

    def close(self):
        "Closes the archive"
        self.zip_file.close()

    def write_string(self,data_string,archive_file_name=None):
        """writes data string to the zipped file archive_name in the archive"""
        self.zip_file.writestr(archive_file_name,data_string)
        self.files = self.zip_file.namelist()

    def __del__(self):
        "Class Destructor"
        self.zip_file.close()
#-----------------------------------------------------------------------------
# Module Scripts
# Todo: Make this script actually test functionality of ZipArchive
def test_ZipArchive(file_path="Test_Zip_File.zip"):
    #os.chdir()
    file_names=[file_path]
    test_string="A test string"
    new_zip=ZipArchive(None,files=file_names)
    new_zip.add_file(file_path,archive_name="New_directory/file.txt")
    #new_zip.add_all_from_directory(r"C:\Users\sandersa\PyCharm Projects\Jupyter-Notebooks\Radical_Correction_Files")
    new_zip.write_string(test_string,"String_test.txt")
    print(new_zip.files)
    new_zip.close()
#-----------------------------------------------------------------------------
# Module Runner
if __name__ == '__main__':
    pass

Functions

def add_all_files(

zipfile, top_directory)

Adds all of the files under top directory into the zipfile and closes the file

def add_all_files(zipfile,top_directory):
    """Adds all of the files under top directory into the zipfile and closes the file"""
    for directory, dirnames, filenames in os.walk(top_directory):
        for filename in filenames:
            zipfile.write(os.path.join(directory,filename),
                          os.path.join(os.path.relpath(directory,top_directory),filename))

def extract_all(

zipfile, directory)

Extracts all files from the zip archive to the specified directory

def extract_all(zipfile,directory):
    """Extracts all files from the zip archive to the specified directory"""
    zipfile.extractall(directory)

def test_ZipArchive(

file_path='Test_Zip_File.zip')

def test_ZipArchive(file_path="Test_Zip_File.zip"):
    #os.chdir()
    file_names=[file_path]
    test_string="A test string"
    new_zip=ZipArchive(None,files=file_names)
    new_zip.add_file(file_path,archive_name="New_directory/file.txt")
    #new_zip.add_all_from_directory(r"C:\Users\sandersa\PyCharm Projects\Jupyter-Notebooks\Radical_Correction_Files")
    new_zip.write_string(test_string,"String_test.txt")
    print(new_zip.files)
    new_zip.close()

Classes

class ZipArchive

A container for zipped files, provides the ability to open, add files to, extract files from and save zip archives. !#python defaults={"specific_descriptor":'Data', "general_descriptor":'Archive', "directory":None, "extension":'zip', "temp_directory":None, "name":None, "path":None, "files":None}

class ZipArchive():
    """A container for zipped files, provides the ability to open, add files to, extract files from
    and save zip archives.
        !#python
        defaults={"specific_descriptor":'Data',
                  "general_descriptor":'Archive',
                  "directory":None,
                  "extension":'zip',
                  "temp_directory":None,
                  "name":None,
                  "path":None,
                  "files":None}        """
    def __init__(self,file_path=None,**options):
        " Initializes the ZipArchive class "
        # This is a general pattern for adding a lot of options some with defaults
        defaults={"specific_descriptor":'Data',
                  "general_descriptor":'Archive',
                  "directory":None,
                  "extension":'zip',
                  "temp_directory":None,
                  "name":None,
                  "path":None,
                  "files":None}
        self.options={}
        for key,value in defaults.items():
            self.options[key]=value
        for key,value in options.items():
            self.options[key]=value
        if file_path is None:
            if self.options["path"] is None:
                self.name=auto_name(self.options["specific_descriptor"],
                                    self.options["general_descriptor"],
                                    self.options["directory"],
                                    self.options["extension"])
                if self.options['directory'] is None:
                    self.path=self.name
                else:
                    self.path=os.path.join(self.options["directory"],self.name)
            else:
                self.path=self.options["path"]
            self.zip_file=zipfile.ZipFile(self.path,'w')
            if self.options["files"] is not None:
                for file_name in self.options["files"]:
                    self.zip_file.write(file_name,os.path.split(file_name)[1])
        else:
            self.zip_file=zipfile.ZipFile(file_path,'a')
        self.files=self.zip_file.namelist()

    def save(self,path=None,**save_options):
        """Saves the file to path"""
        if path is None:
            pass
        else:
            if not self.options["temp_directory"]:
                try:
                    os.mkdir("./Temp")
                except:
                    pass
                self.options["temp_directory"]="./Temp"
            temp_path=os.path.join(self.options["temp_directory"],"temp_file")
            temp_extracted=extract_all(self.zip_file,temp_path)
            temp_zip=zipfile.ZipFile(path,'w')
            add_all_files(temp_zip,temp_path)
            # need to delete the temp folder
            shutil.rmtree(temp_path)
            temp_zip.close()


    def extract_all(self,destination_directory=None):
        """Extract all in the destination directory (default is current working directory)"""
        if destination_directory is None:
            destination_directory=os.getcwd()
        extract_all(self.zip_file,destination_directory)

    def add_all_from_directory(self,directory=None):
        """Adds all files in the directory"""
        if directory is None:
            directory=os.getcwd()
        add_all_files(self.zip_file,directory)
        self.files=self.zip_file.namelist()

    def add_file(self,file_path,archive_name=None):
        """Adds the file specified by file_path to the zip archive"""
        if archive_name is None:
            archive_name=os.path.split(file_path)[1]
        self.zip_file.write(file_path,archive_name)
        self.files=self.zip_file.namelist()

    def close(self):
        "Closes the archive"
        self.zip_file.close()

    def write_string(self,data_string,archive_file_name=None):
        """writes data string to the zipped file archive_name in the archive"""
        self.zip_file.writestr(archive_file_name,data_string)
        self.files = self.zip_file.namelist()

    def __del__(self):
        "Class Destructor"
        self.zip_file.close()

Ancestors (in MRO)

Instance variables

var files

var options

Methods

def __init__(

self, file_path=None, **options)

Initializes the ZipArchive class

def __init__(self,file_path=None,**options):
    " Initializes the ZipArchive class "
    # This is a general pattern for adding a lot of options some with defaults
    defaults={"specific_descriptor":'Data',
              "general_descriptor":'Archive',
              "directory":None,
              "extension":'zip',
              "temp_directory":None,
              "name":None,
              "path":None,
              "files":None}
    self.options={}
    for key,value in defaults.items():
        self.options[key]=value
    for key,value in options.items():
        self.options[key]=value
    if file_path is None:
        if self.options["path"] is None:
            self.name=auto_name(self.options["specific_descriptor"],
                                self.options["general_descriptor"],
                                self.options["directory"],
                                self.options["extension"])
            if self.options['directory'] is None:
                self.path=self.name
            else:
                self.path=os.path.join(self.options["directory"],self.name)
        else:
            self.path=self.options["path"]
        self.zip_file=zipfile.ZipFile(self.path,'w')
        if self.options["files"] is not None:
            for file_name in self.options["files"]:
                self.zip_file.write(file_name,os.path.split(file_name)[1])
    else:
        self.zip_file=zipfile.ZipFile(file_path,'a')
    self.files=self.zip_file.namelist()

def add_all_from_directory(

self, directory=None)

Adds all files in the directory

def add_all_from_directory(self,directory=None):
    """Adds all files in the directory"""
    if directory is None:
        directory=os.getcwd()
    add_all_files(self.zip_file,directory)
    self.files=self.zip_file.namelist()

def add_file(

self, file_path, archive_name=None)

Adds the file specified by file_path to the zip archive

def add_file(self,file_path,archive_name=None):
    """Adds the file specified by file_path to the zip archive"""
    if archive_name is None:
        archive_name=os.path.split(file_path)[1]
    self.zip_file.write(file_path,archive_name)
    self.files=self.zip_file.namelist()

def close(

self)

Closes the archive

def close(self):
    "Closes the archive"
    self.zip_file.close()

def extract_all(

self, destination_directory=None)

Extract all in the destination directory (default is current working directory)

def extract_all(self,destination_directory=None):
    """Extract all in the destination directory (default is current working directory)"""
    if destination_directory is None:
        destination_directory=os.getcwd()
    extract_all(self.zip_file,destination_directory)

def save(

self, path=None, **save_options)

Saves the file to path

def save(self,path=None,**save_options):
    """Saves the file to path"""
    if path is None:
        pass
    else:
        if not self.options["temp_directory"]:
            try:
                os.mkdir("./Temp")
            except:
                pass
            self.options["temp_directory"]="./Temp"
        temp_path=os.path.join(self.options["temp_directory"],"temp_file")
        temp_extracted=extract_all(self.zip_file,temp_path)
        temp_zip=zipfile.ZipFile(path,'w')
        add_all_files(temp_zip,temp_path)
        # need to delete the temp folder
        shutil.rmtree(temp_path)
        temp_zip.close()

def write_string(

self, data_string, archive_file_name=None)

writes data string to the zipped file archive_name in the archive

def write_string(self,data_string,archive_file_name=None):
    """writes data string to the zipped file archive_name in the archive"""
    self.zip_file.writestr(archive_file_name,data_string)
    self.files = self.zip_file.namelist()