Zip Compressor Tool
This utility compresses files and directories into a ZIP archive. It mimics the basic functionality of standard zip tools, allowing you to specify multiple input paths and an output filename.
Modules Used:
- zipfile: To create the ZIP archive.
- argparse: To handle command-line arguments.
- pathlib: For file path handling.
The Code
Save this as compressor.py.
import zipfile
import argparse
from pathlib import Path
import sys
def compress_files(inputs, output_file):
output_path = Path(output_file)
# Ensure output ends with .zip
if output_path.suffix.lower() != '.zip':
output_path = output_path.with_suffix('.zip')
print(f"Creating archive: {output_path}")
try:
# ZIP_DEFLATED is the standard compression method
with zipfile.ZipFile(output_path, 'w', zipfile.ZIP_DEFLATED) as zipf:
for input_path_str in inputs:
path = Path(input_path_str)
if not path.exists():
print(f"Warning: '{path}' does not exist. Skipping.")
continue
if path.is_file():
print(f" Adding file: {path.name}")
# arcname is the name inside the zip file
zipf.write(path, arcname=path.name)
elif path.is_dir():
print(f" Adding folder: {path.name}")
for file_path in path.rglob('*'):
if file_path.is_file():
# Calculate relative path for arcname to maintain structure
# e.g., if zipping 'folder', 'folder/sub/file.txt' becomes 'folder/sub/file.txt'
arcname = file_path.relative_to(path.parent)
zipf.write(file_path, arcname=arcname)
print("Compression complete.")
except Exception as e:
print(f"Error: {e}")
if __name__ == "__main__":
parser = argparse.ArgumentParser(description="Zip Compressor Tool")
parser.add_argument("inputs", nargs='+', help="Input files or directories to compress")
parser.add_argument("-o", "--output", required=True, help="Output ZIP filename")
args = parser.parse_args()
compress_files(args.inputs, args.output)
Usage
# Compress a single file
python compressor.py document.txt -o archive.zip
# Compress multiple files and folders
python compressor.py file1.txt ./images ./data -o backup.zip