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内的文件将会从/开始。具体为什么,没有进一步研究