以下是对代码的优化建议:

  1. 使用函数封装代码块

将 process_video 和 process_folder 函数封装起来,使代码更加模块化和易于维护。同时可以减少全局变量的使用,更好地隔离作用域。

  1. 使用列表推导式简化代码

在 process_folder 函数中,可以使用列表推导式来获取视频文件列表,从而避免使用循环。

  1. 使用 pathlib 模块替代 os.path

pathlib 模块提供了更加面向对象的文件路径处理方式,可以使代码更加简洁和易于阅读。

  1. 使用 f-strings 替代字符串拼接

使用 f-strings 可以使代码更加简洁易读。同时,可以在字符串中直接使用变量,避免使用繁琐的字符串拼接操作。

  1. 将常量提取为全局变量

将 supported_formats 常量提取为全局变量,避免在函数中多次定义,提高代码的可读性和可维护性。

综上所述,以下是对代码的优化实现:

import subprocess import re import math from pathlib import Path

import openpyxl

视频格式

SUPPORTED_FORMATS = [ '.mp4', '.avi', '.mkv', '.wmv', '.mov', '.flv', '.m2ts', '.ts', '.rm', '.rmvb', '.vob', '.3gp', '.webm', '.hdmov', '.mp4v', '.mpv4', '.divx', '.xvid', '.f4v', '.mpeg', '.asf', '.asx', '.m2t' ]

PATTERN = re.compile(r'(\d+)\s+(\d+)')

def process_video(video_file): # 获取文件名 file_name = video_file.name

# 获取文件大小
size_str = convert_size(video_file.stat().st_size)

# 使用mediainfo获取视频信息 / 音频信息
with subprocess.Popen(['mediainfo',
                       '--Inform=Video;%Format%|%Width%x%Height%|%BitRate/String%|%FrameRate%|%Duration/String3%',
                       str(video_file)],
                      stdout=subprocess.PIPE) as video_proc, \
        subprocess.Popen(['mediainfo',
                           '--Inform=Audio;%BitRate/String%|%SamplingRate/String%|%Language/String%',
                           str(video_file)],
                           stdout=subprocess.PIPE) as audio_proc:
    video_output = video_proc.communicate()[0].decode().strip()
    audio_output = audio_proc.communicate()[0].decode().strip()

# 解析输出结果
video_info = video_output.split('|')
audio_info = audio_output.split('|')

# 处理多音轨情况
audio_bitrate, audio_sampling_rate, audio_lang = zip(*[(audio_info[i*3],
                                                        audio_info[i*3+1], audio_info[i*3+2]) for i in range(len(audio_info)//3)])

# 时长取整
duration = video_info[4].split('.')[0]
h, m, s = duration.split(':')
duration = f'{h}:{m}:{str(s).zfill(2)}'

# 以分钟计算的时长
duration_minutes = int(h) * 60 + int(m) + math.ceil(float(s)) / 60

# 计算压缩比率
ratio = round(duration_minutes / video_file.stat().st_size * 1000000000, 2)

# 使用正则表达式替换码率数据中第1、2数字之间的空格
bitrate = re.sub(PATTERN, r'\1\2', video_info[2])

# 将帧率转换为数字
frame_rate = float(video_info[3])

print(f'{file_name}, {size_str}, {duration}, {video_info[1]}, {bitrate}, {video_info[3]}, {" / ".join(audio_lang)}, {ratio}')

def process_folder(video_folder): # 获取视频文件递归 video_files = [f for f in Path(video_folder).rglob('*') if f.suffix in SUPPORTED_FORMATS]

total_count = len(video_files)
if total_count == 0:
    print('无视频文件或路径为空')
else:
    for video_file in video_files:
        process_video(video_file)

def convert_size(size): # 单位转换 units = ['B', 'KiB', 'MiB', 'GiB'] i = 0 while size >= 1024 and i < len(units)-1: size /= 1024 i += 1 return f'{size:.2f} {units[i]}'

文件路径

path = input('请输入文件路径:') if Path(path).is_file(): # 1个文件 total_count += 1 process_video(Path(path)) elif Path(path).is_dir(): process_folder(path)

对下面的python3代码进行优化import osimport reimport subprocessimport openpyxlimport math# 视频格式supported_formats = mp4 avi mkv wmv mov flv m2ts ts rm rmvb vob 3gp webm hdmov mp4v mpv4 divx xvid f

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

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