import os import sys from pathlib import Path # Install these first: # pip install patool py7zr rarfile try: from patoolib import extract_archive except ImportError: print("Error: 'patool' is not installed. Run: pip install patool py7zr rarfile") sys.exit(1) def extract_archive_to_folder(archive_path: Path, base_dir: Path): """Extract a single archive to extracted_{name} folder.""" # Get archive name without extension name_without_ext = archive_path.stem extract_dir = base_dir / f"bg_mountains_{name_without_ext}" # Create the output directory if it doesn't exist extract_dir.mkdir(parents=True, exist_ok=True) print(f"Extracting: {archive_path.name} → {extract_dir.name}/") try: # patool automatically detects format (zip, rar, 7z, etc.) extract_archive(str(archive_path), outdir=str(extract_dir), verbosity=0) print(f"✓ Successfully extracted: {archive_path.name}\n") except Exception as e: print(f"✗ Failed to extract {archive_path.name}: {e}\n") def main(folder_path: str = ".", recursive: bool = False): base_dir = Path(folder_path).resolve() if not base_dir.exists(): print(f"Error: Folder '{base_dir}' does not exist.") return print(f"Scanning for archives in: {base_dir}\n") # Supported extensions extensions = {'.zip', '.rar', '.7z'} # Find all matching archives if recursive: archive_files = [p for p in base_dir.rglob("*") if p.is_file() and p.suffix.lower() in extensions] else: archive_files = [p for p in base_dir.iterdir() if p.is_file() and p.suffix.lower() in extensions] if not archive_files: print("No .zip, .rar, or .7z files found.") return print(f"Found {len(archive_files)} archive(s).\n") for archive in sorted(archive_files): extract_archive_to_folder(archive, base_dir) print("Extraction process completed!") if __name__ == "__main__": # Usage examples: # python extract_archives.py # current folder, non-recursive # python extract_archives.py "/path/to/folder" # specific folder # python extract_archives.py "/path/to/folder" --recursive import argparse parser = argparse.ArgumentParser(description="Extract .zip/.rar/.7z archives into separate folders.") parser.add_argument("folder", nargs="?", default=".", help="Folder to scan (default: current directory)") parser.add_argument("-r", "--recursive", action="store_true", help="Search subfolders recursively") args = parser.parse_args() main(args.folder, args.recursive)