亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Python > 正文

編寫Python腳本來獲取mp3文件tag信息的教程

2020-01-04 19:17:03
字體:
來源:轉載
供稿:網友

這篇文章主要介紹了編寫Python腳本來獲取mp3文件tag信息的教程,代碼基于Python2.x,文中的注釋很詳細,需要的朋友可以參考下

下面利用一個python的實例程序,來學習python。這個程序的目的就是分析出所有MP3文件的Tag信息并輸出。

import os # 導入os模塊,提供文件路徑,列出文件等方法

import sys # 導入sys模塊,使用sys.modules獲取模塊中的所有內容,類似反射的功能

from UserDict import UserDict # 這個表示從UserDict類中導入UserDict,類似于Java中的 import UserDict.UserDict

 

 
  1. def stripnulls(data): 
  2. "一個空字符串的處理函數將所有00字節的內容替換為空字符,病將前后的空字符串去掉" 
  3. # Python中的strip用于去除字符串的首尾字符,同理,lstrip用于去除左邊的字符,rstrip用于去除右邊的字符。 
  4. return data.replace("/00""").strip() 
  5.  
  6. class FileInfo(UserDict): 
  7. '''文件基類,存儲文件的文件名,繼承自UserDict(存儲key-value的一個類,可以重寫__setitem__,__getitem__方法, 
  8. 就可以使用[])''
  9. # self是定義時使用,使用時不需要,如果沒有參數,則filename默認None,如果有一個參數的話,參數即為filename 
  10. def __init__(self, filename=None): 
  11. UserDict.__init__(self) # 初始化父類 
  12. self["name"] = filename # 設置name為 filaname 
  13.  
  14. class MP3FileInfo(FileInfo): 
  15. "MP3文件的信息類,用于分析MP3文件和存儲信息" 
  16. # tagDataMap 用于存儲MP3的Tag信息分別所在位置,( key : 開始位置,結束位置, 處理函數), 
  17. # stripnulls表示最開始定義的函數 
  18. tagDataMap = {"title" : ( 3, 33, stripnulls), 
  19. "artist" : ( 33, 63, stripnulls), 
  20. "album" : ( 63, 93, stripnulls), 
  21. "year" : ( 93, 97, stripnulls), 
  22. "comment" : ( 97, 126, stripnulls), 
  23. "genre" : (127, 128, ord)} 
  24.  
  25. def __parse(self, filename): # 解析MP3文件 
  26. self.clear() 
  27. try
  28. fsock = open(filename, "rb", 0) # 打開文件 
  29. try
  30. # 設置文件讀取的指針位置, seek第二個參數,2表示從文件結尾作為參考點, 
  31. # -128表示還有128字節結尾的點,0表示文件開頭做參考點,1表示當前位置做參考點 
  32. fsock.seek(-128, 2) 
  33. tagdata = fsock.read(128) # 讀取128字節的數據 
  34. finally
  35. fsock.close() # 關閉文件,注意在finally中,出錯也需要關閉文件句柄 
  36. if tagdata[:3] == "TAG": # 判斷是否是有效的含Tag的MP3文件 
  37. # 循環取出Tag信息位置信息, 如3, 33, stripnulls,并依次賦給start, end, parseFunc 
  38. for tag, (start, end, parseFunc) in self.tagDataMap.items(): 
  39. # tagdata[start:end]讀出start到end的字節,使用parseFunc處理這些內容 
  40. self[tag] = parseFunc(tagdata[start:end]) 
  41. except IOError: # 如果出現IOError,則跳過繼續 
  42. pass 
  43.  
  44. # 重寫__setitem__方法,上面的self[tag] = parseFunc(tagdata[start:end])就會使用這個方法, 
  45. # key為tag,itme為parseFunc(tagdata[start:end]) 
  46. def __setitem__(self, key, item): 
  47. if key == "name" and item: # 如果key是 name,并且 item不為空 
  48. self.__parse(item) # 解析MP3文件 
  49. # problem here,should out of the if 
  50. # FileInfo.__setitem__(self, key, item) 如果使用這個縮進就會出現錯誤 
  51. # 之前的錯誤點,注意這兒的縮進,無論如何都會存儲key-value,使用FileInfo.__setitem__父類的方法來存儲 
  52. FileInfo.__setitem__(self, key, item) 
  53.  
  54. def listDirectory(directory, fileExtList): 
  55. "獲取directory目錄下的所有fileExtList格式的文件,fileExtList是一個列表,可以有多種格式" 
  56. fileList = [os.path.normcase(f) 
  57. for f in os.listdir(directory)] # 列出所有 directory的文件 
  58. fileList = [os.path.join(directory, f) 
  59. for f in fileList 
  60. # 過濾文件,滿足fileExtList內的一種格式。os.path.splitext將文件分成文件名和擴展名 
  61. if os.path.splitext(f)[1] in fileExtList] 
  62.  
  63. # sys.modules[FileInfo.__module__] 獲取FileInfo.__module__模塊,其中FileInfo.__module__在此會是 main, 
  64. # 如果被別的模塊調用的話就不是了,這是為什么不直接用“main” 
  65. def getFileInfoClass(filename, module=sys.modules[FileInfo.__module__]): 
  66. "定義一個函數,獲取文件的信息" 
  67. # 獲取需要用來解析的類,如果是mp3文件結果為MP3FileInfo,其他為FileInfo 
  68. subclass = "%sFileInfo" % os.path.splitext(filename)[1].upper()[1:] 
  69. # 返回一個類,注意,返回的是一個“類”。使用getattr獲取moudle模塊中的subclass類 
  70. return hasattr(module, subclass) and getattr(module, subclass) or FileInfo 
  71. # 注意,這句話可能比較難理解, getFileInfoClass(f) (f)為什么會有兩個(f)呢,上面已經說過getFileInfoClass(f) 
  72. # 根據文件名返回一個解析類,這兒是返回就是MP3FileInfo,而第二個(f)就表示對這個類以f初始化MP3FileInfo(f) 
  73. return [getFileInfoClass(f) (f) for f in fileList] 
  74.  
  75. if __name__ == "__main__": # main函數,在別的模塊中不會允許這里面的代碼了 
  76. for info in listDirectory("E://Music", [".mp3"]): # 循環獲取E://Music文件夾中所有的mp3文件的信息 
  77. # 由于MP3FileInfo繼承自FileInfo,FileInfo繼承自UserDict,這個的items()就是獲取key-value集合。 
  78. # 使用"%s=%s"格式化輸出,使用"/n".join將所有信息以換行連接。 
  79. print "/n".join(["%s=%s" % (k, v) for k, v in info.items()]) 
  80. print # 每一個文件之后,輸出一個空行 

結果為:

 

 
  1. album=What Are Words - Single 
  2.  
  3. comment=pythontab 
  4.  
  5. name=E:/Music/chris medina - what_are_words.mp3 
  6.  
  7. title=What Are Words 
  8.  
  9. artist=Chris Medina 
  10.  
  11. year=2011 
  12.  
  13. genre=13 
  14.  
  15.  
  16.  
  17. album=After the Wedding 
  18.  
  19. comment=pythontab 
  20.  
  21. name=E:/Music/two fathers.mp3 
  22.  
  23. title=Two Fathers 
  24.  
  25. artist=pythontab 
  26.  
  27. year=2010 
  28.  
  29. genre=255 

注意:邏輯比較多,代碼不算少,不懂的多看注釋

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产欧美日韩中文字幕| 91国内精品久久| 亚洲国产精品美女| 久久久精品视频成人| 国产极品jizzhd欧美| 另类图片亚洲另类| 欧美在线视频观看免费网站| 亚洲成人黄色网| 国产成人久久久精品一区| 国产精品亚洲综合天堂夜夜| 国产欧美精品一区二区三区介绍| 国产日韩欧美中文在线播放| 45www国产精品网站| 久久亚洲精品一区| 国产精品6699| 国产精品成人播放| 1769国内精品视频在线播放| 欧洲精品久久久| 日韩精品小视频| 欧美wwwxxxx| 亚洲视频在线视频| 国产视频福利一区| 国产精品久久久久久久久久| 亚洲国产婷婷香蕉久久久久久| 欧美日韩国产综合视频在线观看中文| 黑人巨大精品欧美一区免费视频| 国产精品永久免费| 97精品国产aⅴ7777| 国产精品一区电影| 国产欧美精品一区二区| 久久的精品视频| 国产精品一区二区久久| 国产综合在线观看视频| 亚洲人成77777在线观看网| 国产精品美女www| 国产精品久久国产精品99gif| 日韩欧美在线第一页| 国产精品久久av| 亚洲国产毛片完整版| 欧美日韩一二三四五区| 亚洲人成啪啪网站| 国产亚洲精品美女久久久| 国产成人涩涩涩视频在线观看| 亚洲www视频| 欧美一级大片在线观看| 亚洲人午夜色婷婷| 成人国内精品久久久久一区| 亚洲伊人久久大香线蕉av| 午夜精品视频在线| 亚洲精品一区久久久久久| 亚洲精美色品网站| 欧美乱人伦中文字幕在线| 午夜精品一区二区三区在线视频| 亚洲欧美日韩中文视频| 在线免费观看羞羞视频一区二区| 91精品国产免费久久久久久| 久久久免费精品视频| 国内精品久久久久伊人av| 亚洲精品福利在线观看| 亚洲亚裔videos黑人hd| 久久久噜噜噜久久| 日韩高清免费在线| 欧美中文字幕视频| 亚洲四色影视在线观看| 中文欧美在线视频| 成人免费福利视频| 日本一区二区三区四区视频| 奇米一区二区三区四区久久| 欧美精品电影免费在线观看| 日韩欧美国产高清91| 国外成人免费在线播放| 亚洲国产精品悠悠久久琪琪| 国内成人精品一区| 亚洲高清在线观看| 国外成人在线播放| 欧美日韩福利在线观看| 久久午夜a级毛片| xxx成人少妇69| 国产一区二区三区在线视频| 一区二区在线免费视频| 亚洲石原莉奈一区二区在线观看| 亚洲国产精品字幕| 麻豆乱码国产一区二区三区| 国产精品人成电影在线观看| 日本高清+成人网在线观看| 日本欧美在线视频| 亚洲人成毛片在线播放| 亚洲黄色片网站| 国产成人一区二区三区| 超碰日本道色综合久久综合| 91av在线免费观看视频| 欧美激情亚洲国产| 欧美成人免费在线观看| 日本伊人精品一区二区三区介绍| 久久99精品久久久久久琪琪| 成人免费视频在线观看超级碰| 亚洲国产美女久久久久| 久久午夜a级毛片| 8x海外华人永久免费日韩内陆视频| 中文字幕在线国产精品| 国产欧美欧洲在线观看| 亚洲第一级黄色片| 97久久精品国产| 国产成人免费av电影| 日韩欧美综合在线视频| 国产成人涩涩涩视频在线观看| 日韩电影视频免费| 亚洲精品久久久久中文字幕欢迎你| 日韩高清中文字幕| 久久久精品在线| 久久久久久12| 美日韩精品视频免费看| 中日韩午夜理伦电影免费| 亚洲精选一区二区| 亚洲一区二区三区成人在线视频精品| 国产综合在线观看视频| 欧美成人高清视频| 国产精品爱啪在线线免费观看| 国产精品自产拍在线观看| 亚洲成av人影院在线观看| 青青草成人在线| 日韩成人在线网站| 日韩欧美在线一区| 97在线视频精品| 成人xxxxx| 久久99国产精品久久久久久久久| 日韩有码片在线观看| 亚洲无线码在线一区观看| 国产一区二区三区免费视频| 亚洲国产精品久久91精品| 欧美中文字幕在线视频| 日韩av影院在线观看| 欧美日韩国产色视频| 在线看片第一页欧美| 日韩女优人人人人射在线视频| 国产精品久久中文| 亚洲伊人第一页| 91精品国产99久久久久久| 最新91在线视频| 在线午夜精品自拍| 久久理论片午夜琪琪电影网| 在线观看国产成人av片| 国产精品第一页在线| 92国产精品久久久久首页| 国产在线拍揄自揄视频不卡99| 亚洲精品一区中文字幕乱码| 在线观看免费高清视频97| 亚洲精品www| 美女视频黄免费的亚洲男人天堂| 欧美精品电影在线| 午夜精品在线视频| 国产午夜精品视频| 久久久久在线观看| 国产视频精品一区二区三区| 亚洲a∨日韩av高清在线观看| 欧美大片在线免费观看| 色无极亚洲影院| 91国产精品电影| 日韩美女视频在线观看| 668精品在线视频| 欧美日韩一区二区在线| 精品国产鲁一鲁一区二区张丽| 久久久影视精品| 激情久久av一区av二区av三区|