# 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:**
*   [[programming/python/modules/zipfile-module|zipfile]]: To create the ZIP archive.
*   [[programming/python/modules/argparse-module|argparse]]: To handle command-line arguments.
*   [[programming/python/modules/pathlib-module|pathlib]]: For file path handling.

## The Code

Save this as `compressor.py`.

```python
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

```bash
# 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
```

[[programming/python/python]]