python实现提取iso中的文件(支持多平台)

#! /bin/python3
import os
import sys
import time
import fnmatch
from pathlib import Path
import subprocess as sp



def extract_from_iso(fn_iso, fns_to_extract, folder_store):
    """
    从iso文件中提取内容
    :param fn_iso: iso文件路径
    :param fns_to_extract: 待提取文件相对路径列表,支持shell通配符匹配。示例:['path1/a999.txt', 'path1/b*.txt']
    :param folder_store: 提取的文件保存目录
    :return:
    """
    try:
        import pycdlib
    except ImportError:
        cmd = f'{sys.executable} -m pip install pycdlib'
        p = sp.Popen(cmd.split(' '), stdout=sp.PIPE, stderr=sp.PIPE, encoding='utf-8')
        p.wait()
        print(f'{cmd}  stdout: {p.stdout.read()}  ; stderr: {p.stderr.read()}')

        import pycdlib

    t0 = time.time()
    iso = pycdlib.PyCdlib()

    iso.open(fn_iso)
    matched_files = []

    fns_to_extract = [i.upper().replace('-', '_') for i in fns_to_extract]
    fns_to_extract += [i if i.startswith('/') else f'/{i}' for i in fns_to_extract]
    print(f'fns_to_extract: {fns_to_extract}')

    for path_to_here, dirlist, filelist in iso.walk(iso_path='/'):
        print(f'path_to_here: {path_to_here}\ndirlist: {dirlist}\nfilelist: {filelist}')

        for file in filelist:
            for fn_to_extract in fns_to_extract:
                fn_ = f'{path_to_here}/{file}'
                if fnmatch.fnmatch(fn_, fn_to_extract):
                    matched_files.append(fn_)

    print(f'matched_files: {matched_files}')

    for file_path in matched_files:
        # 构建输出文件路径(转换为系统对应的路径分隔符)
        output_file = os.path.join(
            folder_store,
            file_path.lstrip('/').replace('/', os.sep)
        )
        # 创建输出文件的父目录
        Path(os.path.dirname(output_file)).mkdir(parents=True, exist_ok=True)

        # 提取文件=
        iso.get_file_from_iso(local_path=output_file, iso_path=file_path)
        print(f"已提取: {output_file}")

    iso.close()
    print(f'提取耗时:{time.time() - t0} s')

 

pycdlib解析路径的函数,比如pycdlib.PyCdlib().walk,需要传入参数iso_path='/',此时iso内的文件将会从/开始。具体为什么,没有进一步研究

 

posted @ 2025-10-11 10:39  小鱼圆又圆  阅读(5)  评论(0)    收藏  举报