Python实例获取mp3文件的tag信息
下面利用一个python的实例程序,来学习python。这个程序的目的就是分析出所有MP3文件的Tag信息并输出。
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 | importos # 导入os模块,提供文件路径,列出文件等方法importsys # 导入sys模块,使用sys.modules获取模块中的所有内容,类似反射的功能fromUserDict importUserDict # 这个表示从UserDict类中导入UserDict,类似于Java中的 import UserDict.UserDict defstripnulls(data):    "一个空字符串的处理函数将所有00字节的内容替换为空字符,病将前后的空字符串去掉"    # Python中的strip用于去除字符串的首尾字符,同理,lstrip用于去除左边的字符,rstrip用于去除右边的字符。    returndata.replace("\00", "").strip() classFileInfo(UserDict):    '''文件基类,存储文件的文件名,继承自UserDict(存储key-value的一个类,可以重写__setitem__,__getitem__方法,    就可以使用[])'''    # self是定义时使用,使用时不需要,如果没有参数,则filename默认None,如果有一个参数的话,参数即为filename    def__init__(self, filename=None):        UserDict.__init__(self) # 初始化父类        self["name"] =filename # 设置name为 filaname classMP3FileInfo(FileInfo):    "MP3文件的信息类,用于分析MP3文件和存储信息"    # tagDataMap 用于存储MP3的Tag信息分别所在位置,( key : 开始位置,结束位置, 处理函数),    # stripnulls表示最开始定义的函数    tagDataMap ={"title": ( 3, 33, stripnulls),    "artist": ( 33, 63, stripnulls),    "album": ( 63, 93, stripnulls),    "year": ( 93, 97, stripnulls),    "comment": ( 97, 126, stripnulls),    "genre": (127, 128, ord)}         def__parse(self, filename): # 解析MP3文件        self.clear()        try:            fsock =open(filename, "rb", 0) # 打开文件            try:                # 设置文件读取的指针位置, seek第二个参数,2表示从文件结尾作为参考点,                # -128表示还有128字节结尾的点,0表示文件开头做参考点,1表示当前位置做参考点                fsock.seek(-128, 2)                tagdata =fsock.read(128) # 读取128字节的数据            finally:                fsock.close() # 关闭文件,注意在finally中,出错也需要关闭文件句柄            iftagdata[:3] =="TAG": # 判断是否是有效的含Tag的MP3文件                # 循环取出Tag信息位置信息, 如3, 33, stripnulls,并依次赋给start, end, parseFunc                fortag, (start, end, parseFunc) inself.tagDataMap.items():                    # tagdata[start:end]读出start到end的字节,使用parseFunc处理这些内容                    self[tag] =parseFunc(tagdata[start:end])        exceptIOError: # 如果出现IOError,则跳过继续            pass         # 重写__setitem__方法,上面的self[tag] = parseFunc(tagdata[start:end])就会使用这个方法,    # key为tag,itme为parseFunc(tagdata[start:end])    def__setitem__(self, key, item):        ifkey =="name"anditem: # 如果key是 name,并且 item不为空            self.__parse(item) # 解析MP3文件            # problem here,should out of the if            # FileInfo.__setitem__(self, key, item) 如果使用这个缩进就会出现错误        # 之前的错误点,注意这儿的缩进,无论如何都会存储key-value,使用FileInfo.__setitem__父类的方法来存储        FileInfo.__setitem__(self, key, item)             deflistDirectory(directory, fileExtList):    "获取directory目录下的所有fileExtList格式的文件,fileExtList是一个列表,可以有多种格式"    fileList =[os.path.normcase(f)        forf inos.listdir(directory)] # 列出所有 directory的文件    fileList =[os.path.join(directory, f)        forf infileList        # 过滤文件,满足fileExtList内的一种格式。os.path.splitext将文件分成文件名和扩展名        ifos.path.splitext(f)[1] infileExtList]             # sys.modules[FileInfo.__module__] 获取FileInfo.__module__模块,其中FileInfo.__module__在此会是 main,    # 如果被别的模块调用的话就不是了,这是为什么不直接用“main”    defgetFileInfoClass(filename, module=sys.modules[FileInfo.__module__]):        "定义一个函数,获取文件的信息"         # 获取需要用来解析的类,如果是mp3文件结果为MP3FileInfo,其他为FileInfo        subclass ="%sFileInfo"%os.path.splitext(filename)[1].upper()[1:]        # 返回一个类,注意,返回的是一个“类”。使用getattr获取moudle模块中的subclass类        returnhasattr(module, subclass) andgetattr(module, subclass) orFileInfo    # 注意,这句话可能比较难理解, getFileInfoClass(f) (f)为什么会有两个(f)呢,上面已经说过getFileInfoClass(f)    # 根据文件名返回一个解析类,这儿是返回就是MP3FileInfo,而第二个(f)就表示对这个类以f初始化MP3FileInfo(f)    return[getFileInfoClass(f) (f) forf infileList] if__name__ =="__main__": # main函数,在别的模块中不会允许这里面的代码了    forinfo inlistDirectory("E:\\Music", [".mp3"]): # 循环获取E:\\Music文件夹中所有的mp3文件的信息        # 由于MP3FileInfo继承自FileInfo,FileInfo继承自UserDict,这个的items()就是获取key-value集合。        # 使用"%s=%s"格式化输出,使用"\n".join将所有信息以换行连接。        print"\n".join(["%s=%s"%(k, v) fork, v ininfo.items()])        print# 每一个文件之后,输出一个空行 | 
结果为:
album=What Are Words - Single
comment=pythontab
name=E:\Music\chris medina - what_are_words.mp3
title=What Are Words
artist=Chris Medina
year=2011
genre=13
album=After the Wedding
comment=pythontab
name=E:\Music\two fathers.mp3
title=Two Fathers
artist=pythontab
year=2010
genre=255
Python实例获取mp3文件的tag信息的更多相关文章
- 【Python】 获取MP3信息replica
		replica 初衷是想要整理iphone中的音乐.IOS(我自己的手机还是IOS8.3,新版本的系统可能有变化了)自带的音乐软件中所有音乐文件都存放在/var/mobile/Media/iTunes ... 
- C# 获取 mp3文件信息
		C# 获取 mp3文件信息[包括:文件大小.歌曲长度.歌手.专辑] 第一种方式:[代码已验证] // http://bbs.csdn.net/topics/390392612 string fil ... 
- 实现php获取mp3文件元信息如播放时间歌曲作者等
		最近收集到一个php获取mp3文件元信息的类,感觉比较方便.现在分享给大家! 下面是使用方式和测试方式: <?php include_once 'mp3file.class.php'; func ... 
- C# 获取 mp3文件信息【包括:文件大小、歌曲长度、歌手、专辑】
		C# 获取 mp3文件信息[包括:文件大小.歌曲长度.歌手.专辑] 第一种方式:[代码已验证] // http://bbs.csdn.net/topics/390392612 string fil ... 
- 获取mp3文件的采样率
		/** * 获取mp3文件的采样率 * @param filefullname 文件完整路径 * @return 采样率 */public int getMp3SampleRate(String fi ... 
- python 如何获取当前文件/文件夹
		python 如何获取当前文件/文件夹? 1.获取当前文件的实际路劲: os.path.realpath(__file__) ==> D:\python_test\test_p ... 
- 【ASP.NET 进阶】获取MP3文件信息并显示专辑图片
		突发奇想,想弄个显示MP3文件信息和专辑图片的小Demo,个人不是大牛,遂百度之,总算搞定,现分享如下. 效果图: GIF效果图: 主要是依靠2个DLL文件:ID3.dll 和 Interop.She ... 
- PHP获取Mp3文件信息
		扫描本地MP3文件,获取文件信息 
- Python中获取异常(Exception)信息
		异常信息的获取对于程序的调试非常重要,可以有助于快速定位有错误程序语句的位置.下面介绍几种python中获取异常信息的方法,这里获取异常(Exception)信息采用try...except...程序 ... 
随机推荐
- 基于matplotlib的数据可视化 -
			matplotlib.pyplot(as mp or as plt)提供基于python语言的绘图函数 引用方式: import matplotlib.pyplot as mp / as plt 本章 ... 
- 在一个gradle 的maven property 里添加多个URL
			这样是会报错的 repositories { mavenCentral() maven { url "http://maven.springframework.org/release&quo ... 
- android控件拖动,移动、解决父布局重绘时控件回到原点
			这是主要代码: 保证其params发生改变,相对于父布局的位置就能达到位置移动到原来的位置 // 每次移动都要设置其layout,不然由于父布局可能嵌套listview,当父布局发生改变冲毁(如下拉刷 ... 
- nodejs 遍历文件夹下所有的图片改名为中文
			安装依赖 $ npm init -y && npm i fs-extra globby request -S main.js const fs = require('node-fs-e ... 
- git 放弃本地修改(转)
			如果在修改时发现修改错误,而要放弃本地修改时, 一, 未使用 git add 缓存代码时. 可以使用 git checkout -- filepathname (比如: git checkout -- ... 
- 在Spring Boot中使用Spring-data-jpa实现分页查询(转)
			在我们平时的工作中,查询列表在我们的系统中基本随处可见,那么我们如何使用jpa进行多条件查询以及查询列表分页呢?下面我将介绍两种多条件查询方式. 1.引入起步依赖 2.对thymeleaf和jpa进 ... 
- telegraf input的配置
			.操作系统基础监控指标配置标准 基础监控使用通用的全局配置文件telegraf.conf,以下只贴上采集器input部分代码 telegraf -config /etc/telegraf/telegr ... 
- 安装python 2.7条件下的pip环境
			wget https://pypi.python.org/packages/ff/d4/209f4939c49e31f5524fa0027bf1c8ec3107abaf7c61fdaad704a648 ... 
- Android: 设置 app 字体大小不跟随系统字体调整而变化
			在做 app 内字体大小的需求,类似于 微信中设置字体大小. 那么就需要 app 不跟随系统字体大小调整而变化,找到了两个方法. 方法1: 重写 getResource() 方法,修改 configu ... 
- 【Unity】12.3 Off Mesh Link组件
			开发环境:Win10.Unity5.3.4.C#.VS2015 创建日期:2016-05-09 一.简介 Off Mesh Link组件用于手动指定路线来生成分离的网格连接.例如,游戏中让行进对象上下 ... 
