解决Python MP3图片提取程序的‘required arguments: mp3File’错误
问题描述
我写了一个从MP3文件提取图片的程序,但运行时总是报错 the following arguments are required: mp3File。我试过初始化mp3File参数但没成功,请问怎么正确添加这个参数让程序正常运行?当前程序目录下有两个MP3文件。
程序代码
ID3类实现
import os # 标准操作系统方法 import argparse # 命令行参数解析 from struct import * # 处理二进制字符串 import string # 字符串工具模块 import time # 日期时间模块 import sys class ID3(): def __init__(self, theFile): try: self.fileName = theFile with open(theFile, 'rb') as mp3File: self.fileContents = mp3File.read() except Exception as err: print("无法处理输入文件: ", theFile, err) quit() # 截取文件前10个字符 stripHeader = self.fileContents[0:6] # 解析头部 id3Header = unpack('3sBBB', stripHeader) self.hdr = id3Header[0] self.version = id3Header[1] self.revision = id3Header[2] self.flag = id3Header[3] if (self.hdr == 'ID3' or self.hdr == b'ID3') and self.version in range(2,5): self.id3 = True else: self.id3 = False print("不支持该MP3文件类型") quit() # 获取并解析大小字节 stripSize = self.fileContents[6:10] id3Size = unpack('BBBB', stripSize) self.id3Size = self.calcID3Size(id3Size) + 10 # 检查非同步标志 if self.flag & 0x60: self.unsync = True # 检查扩展头部标志 if self.flag & 0x40: self.extendedHeader = True # 检查实验性标志 if self.flag & 0x40: self.experimental = True self.processID3Frames() return
主程序
def main(): parser = argparse.ArgumentParser() parser.add_argument('mp3File') theArgs = parser.parse_args() mp3File = theArgs.mp3File # 验证文件存在且是有效文件 if not os.path.isfile(mp3File): sys.exit(mp3File+" 未找到") # 验证图片输出目录是否有效 curDir = os.getcwd() if not os.path.isdir("./images"): # 不存在则尝试创建 try: os.mkdir("./images") except Exception as err: sys.exit("无法创建输出目录: "+str(err)) if __name__ == "__main__": main()
解决方法
报错原因是你用了argparse的位置必填参数,运行程序时必须指定MP3文件名,或者修改代码调整参数逻辑,下面是两种可行方案:
方案1:命令行运行时传入参数
打开终端进入程序所在目录,运行命令时直接跟上MP3文件名即可。假设你的两个文件是song1.mp3和song2.mp3,运行命令如下:
python your_script_name.py song1.mp3
处理第二个文件时则输入:
python your_script_name.py song2.mp3
方案2:修改代码,优化参数逻辑
如果不想每次手动传参,可以修改主程序的argparse配置,支持默认值或批量处理:
方式A:设置默认文件(自动取目录下第一个MP3)
修改主程序,让参数可选,同时默认读取目录下第一个MP3文件,保留手动传参功能:
def main(): import glob # 获取当前目录下所有MP3文件 mp3_files = glob.glob("*.mp3") default_file = mp3_files[0] if mp3_files else "" parser = argparse.ArgumentParser() # 设置参数为可选,添加默认值 parser.add_argument('mp3File', nargs='?', default=default_file, help='要处理的MP3文件路径') theArgs = parser.parse_args() mp3File = theArgs.mp3File if not mp3File: sys.exit("当前目录下没有找到MP3文件") # 验证文件存在且是有效文件 if not os.path.isfile(mp3File): sys.exit(mp3File+" 未找到") # 验证图片输出目录是否有效 curDir = os.getcwd() if not os.path.isdir("./images"): # 不存在则尝试创建 try: os.mkdir("./images") except Exception as err: sys.exit("无法创建输出目录: "+str(err)) # 实例化ID3类开始处理(原代码缺失这一步,必须补上) id3_handler = ID3(mp3File)
方式B:批量处理多个MP3文件
修改参数支持传入多个文件,一次性处理所有MP3:
def main(): parser = argparse.ArgumentParser() # 接受多个MP3文件参数 parser.add_argument('mp3File', nargs='+', help='要处理的MP3文件路径,可传入多个') theArgs = parser.parse_args() for mp3File in theArgs.mp3File: # 验证文件存在且是有效文件 if not os.path.isfile(mp3File): print(mp3File+" 未找到,跳过") continue # 验证图片输出目录是否有效 curDir = os.getcwd() if not os.path.isdir("./images"): # 不存在则尝试创建 try: os.mkdir("./images") except Exception as err: sys.exit("无法创建输出目录: "+str(err)) # 实例化ID3类处理每个文件 id3_handler = ID3(mp3File)
运行时可一次性传入多个文件:
python your_script_name.py song1.mp3 song2.mp3
补充提示
你的ID3类中调用了self.processID3Frames()方法,但未实现该方法,需要补充代码解析ID3标签里的APIC图片帧,将图片数据写入./images目录,否则程序运行到此处会报错。
内容的提问来源于stack exchange,提问作者Leila Jones
相关产品推荐
相关产品推荐

