这段 Python3 代码用于提取视频文件的信息并写入 Excel 文件,整体逻辑清晰,功能完善。但可以考虑添加一些优化措施,提高代码的健壮性和可读性。/n/n1. 异常处理/n/n* 代码中没有对输入的文件夹路径进行验证,如果输入的路径不存在,程序会直接报错。可以添加异常处理机制,例如使用 try-except 语句捕获 FileNotFoundError 异常,并提示用户输入正确的路径。/n* 使用 mediainfo 命令获取视频信息时,可能会出现命令执行失败的情况,例如视频文件损坏或者 mediainfo 命令不可用。可以添加异常处理机制,例如使用 try-except 语句捕获 subprocess.CalledProcessError 异常,并提示用户查看错误信息或尝试重新运行程序。/n/n2. 特殊字符转义/n/n* 在写入 Excel 文件时,如果单元格中的值包含特殊字符(例如双引号、单引号等),可能会导致写入失败。可以使用 openpyxl.utils.escape 函数对特殊字符进行转义。/n/n3. 代码结构调整/n/n* 代码中可以将获取视频信息的逻辑封装成一个函数,以便于重复使用。/n* 可以将一些常量,例如支持的视频格式、Excel 文件名等,定义在代码开头,以提高代码的可读性和可维护性。/n/n以下是代码优化后的示例:/n/npython/nimport os/nimport re/nimport subprocess/nimport openpyxl/nimport math/nfrom openpyxl.styles import Font, PatternFill, Alignment/nfrom openpyxl.utils import escape/n/n# 支持的视频格式/nsupported_formats = ['.mp4', '.avi', '.mkv', '.wmv', '.mov', '.flv', '.m2ts', '.ts', '.rm', '.rmvb',/n '.vob', '.3gp', '.webm', '.hdmov', '.mp4v', '.mpv4', '.divx', '.xvid', '.f4v',/n '.mpeg', '.asf', '.asx', '.m2t']/n# 输出Excel文件夹路径/nexcel_folder = '.'/n# 输出Excel文件名/nexcel_file = 'video_info.xlsx'/n# 正则表达式匹配码率数据中的空格/npattern = re.compile(r'(/d+)/s+(/d+)')/n/n/ndef get_video_info(video_file):/n /'/'/'/n 获取视频信息和音频信息/n/n Args:/n video_file: 视频文件路径/n/n Returns:/n 一个包含视频信息和音频信息的元组/n /'/'/'/n try:/n video_result = subprocess.run(['mediainfo', '--Inform=Video;%Format%|%Width%x%Height%|%BitRate/String%|%FrameRate%|%Duration/String3%', video_file], stdout=subprocess.PIPE)/n video_output = video_result.stdout.decode().strip()/n audio_result = subprocess.run(['mediainfo', '--Inform=Audio;%BitRate/String%|%SamplingRate/String%|%Language/String%', video_file], stdout=subprocess.PIPE)/n audio_output = audio_result.stdout.decode().strip()/n except subprocess.CalledProcessError as e:/n print(f'获取视频信息失败: {e}')/n return None/n/n format, resolution, bitrate, framerate, duration = video_output.split('|')/n audiobitrate, audiosamplingrate, audiolang = audio_output.split('|')/n duration = duration.split('.')[0]/n h, m, s = duration.split(':')/n duration = f'{h}:{m}:{math.ceil(float(s))}'/n ratio = f'{round(float(duration) / os.path.getsize(video_file), 2)}'/n bitrate = re.sub(pattern, r'/1/2', bitrate)/n return format, resolution, bitrate, framerate, duration, audiobitrate, audiosamplingrate, audiolang, ratio/n/n/ndef main():/n # 需要处理的视频文件夹/n video_folder = input('请输入文件夹路径:')/n try:/n # 创建Excel文件/n wb = openpyxl.Workbook()/n ws = wb.active/n ws.title = 'Video Info'/n/n # 设置表头样式/n header_font = Font(bold=True, color='800080') # 紫色/n header_fill = PatternFill('solid', fgColor='C5E0B4')/n header_alignment = Alignment(horizontal='center', vertical='center')/n headers = ['文件名', '文件路径', '格式', '大小', '时长', '分辨率', '码率', '帧率', '音频码率', '音频采样率', '音频语言', '压缩比率']/n for col, header in enumerate(headers, start=1):/n cell = ws.cell(row=1, column=col, value=header)/n cell.font = header_font/n cell.fill = header_fill/n cell.alignment = header_alignment/n/n # 锁定表头/n ws.freeze_panes = 'A2'/n/n # 获取视频文件列表(包括子目录)/n video_files = []/n for root, dirs, files in os.walk(video_folder):/n for file in files:/n for format in supported_formats:/n if file.endswith(format):/n video_files.append(os.path.join(root, file))/n break/n/n # 遍历所有视频文件,获取视频信息、音频信息和音频语言,并写入Excel文件/n for row, video_file in enumerate(video_files, start=2):/n # 获取文件名/n file_name = os.path.basename(video_file)/n/n # 获取文件大小并进行单位换算/n size = os.path.getsize(video_file)/n if size < 1024:/n size_str = f'{size} B'/n elif size < 1024 * 1024:/n size_str = f'{size / 1024:.2f} KiB'/n elif size < 1024 * 1024 * 1024:/n size_str = f'{size / 1024 / 1024:.2f} MiB'/n else:/n size_str = f'{size / 1024 / 1024 / 1024:.2f} GiB'/n/n # 获取视频信息/n video_info = get_video_info(video_file)/n if video_info is None:/n continue/n/n format, resolution, bitrate, framerate, duration, audiobitrate, audiosamplingrate, audiolang, ratio = video_info/n/n # 写入Excel文件/n ws.cell(row=row, column=1, value=escape(file_name))/n ws.cell(row=row, column=2, value=escape(os.path.dirname(video_file))) # 写入文件夹路径/n ws.cell(row=row, column=3, value=escape(format))/n ws.cell(row=row, column=4, value=escape(size_str)) # 写入文件大小/n ws.cell(row=row, column=5, value=escape(duration))/n ws.cell(row=row, column=6, value=escape(resolution))/n ws.cell(row=row, column=7, value=escape(bitrate))/n ws.cell(row=row, column=8, value=escape(framerate))/n ws.cell(row=row, column=9, value=escape(audiobitrate))/n ws.cell(row=row, column=10, value=escape(audiosamplingrate))/n ws.cell(row=row, column=11, value=escape(audiolang))/n ws.cell(row=row, column=12, value=escape(ratio))/n/n # 自动调整列宽/n for col in ws.columns:/n max_length = 0/n column = col[0].column_letter/n for cell in col:/n try:/n if len(str(cell.value)) > max_length:/n max_length = len(str(cell.value))/n except:/n pass/n adjusted_width = (max_length + 2)/n ws.column_dimensions[column].width = adjusted_width + 1 # 列宽+1/n/n # 保存Excel文件/n if not os.path.exists(excel_folder):/n os.makedirs(excel_folder)/n excel_file_path = os.path.join(excel_folder, excel_file)/n wb.save(excel_file_path)/n print(f'视频信息已保存到 {excel_file_path}')/n except FileNotFoundError:/n print(f'文件夹路径 {video_folder} 不存在')/n/nif __name__ == '__main__':/n main()/n/n/n优化说明:/n/n* 代码中增加了 get_video_info 函数,用于获取视频信息和音频信息。该函数包含了对 mediainfo 命令的调用和异常处理。/n* 在获取视频信息时,使用 try-except 语句捕获了 subprocess.CalledProcessError 异常,并提示用户查看错误信息或尝试重新运行程序。/n* 在写入 Excel 文件时,对单元格中的值使用了 openpyxl.utils.escape 函数进行转义,以防止特殊字符导致写入失败。/n* 在 main 函数中,使用 try-except 语句捕获了 FileNotFoundError 异常,并提示用户输入正确的路径。/n/n其他建议:/n/n* 可以使用 logging 模块记录程序运行日志,以便于调试和排查问题。/n* 可以使用 argparse 模块解析命令行参数,例如用户可以指定视频文件夹路径、输出 Excel 文件路径等。/n* 可以使用 tqdm 模块显示进度条,以便于用户了解程序运行进度。/n/n希望这些优化建议能够帮助您提高代码的质量和可读性。

Python3 视频信息提取脚本优化建议

原文地址: https://www.cveoy.top/t/topic/mAPU 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录