好一陣子沒有寫東西了,最近幾天在作一個基於Python pygame的音樂播放器,原本想作完了,再來發篇文章的,可越作越深,框架大體出來了,考慮週期比較長,也多是我我的問題,作得比較慢.下面來談談pygame.mixer.music.load()加載中文名的mp3文件問題. html
(發表時間2017-03-30 22:45:58 原創連接http://www.cnblogs.com/dearvee/p/6649055.html)python
#修正:程序員
2017-04-01 12:51:59編程
今天看了python3.3.3官方文檔編碼部分,前天的方法(也就是下面的方法)是多餘的,當時就感受有點蹩腳,在此修正解決辦法,而且修正前天的錯誤觀點,也就是python對中文不太友好的錯誤觀點.緩存
絕大部分bug取決於程序員自身的功底,而不是某個編程語言自己的問題.我向python以及python的追隨者道歉.這是個人學習不夠普遍,或者說腳踏實地,致使了前面過於片面乃至錯誤的觀點.框架
下面直接上解決方法:編程語言
解決的問題即pygame.mixer.music.load()對中文的識別問題.學習
file=file.encode('utf-8')
好吧,再恬不知恥的來個測試吧Q_Q:測試
下面是不改變編碼帶來的pygame.error錯誤google
改變編碼爲utf-8,排除了pygame.error錯誤
如今程序能夠正常播放中文文件名的mp3文件了.
再次爲前天關於python的中文識別方面的錯誤觀點道歉.
而且但願閱讀筆者其餘文章的同窗,發現筆者的說辭,或者辦法存在問題,可以在評論裏斧正,謝謝.
2017-03-30 22:45:58
#前言:
今天剛剛作了個音樂列表,但筆者發如今指定目錄mp3文件名爲中文時,便出現pygame.error,不能正確加載指定mp3文件.寫好的代碼不想再改了,來個小測試吧
#pygame播放mp3文件:
這裏筆者只介紹一種好理解的方法,具體請查看pygame.mixer.music官方文檔
打開官方文檔,筆者發現,像是發現了新大陸同樣,這傢伙太強大了,而如今我只能用它來播放個人mp3.好吧,剩下的等待之後來發掘吧.幹什麼講什麼,來個播放mp3 test代碼:
import pygame path = 'Pam Pam - Noel Toto.mp3' pygame.mixer.init() pygame.mixer.music.load(path) pygame.mixer.music.play()
其中,path表示待播放mp3文件的路徑及文件名.這裏筆者用的是源生的idle,能夠正常播放此mp3.
#發現Bug:
接着就是筆者在下午作完音樂列表測試播放的時候遇到的問題,即當待加載mp3文件名包含中文時,出現的pygame.error.
這就尷尬了,經過輸出的path,發現中文沒有亂碼,筆者google了下,發現中文的社區有人說python應該儘可能避免中文.也有人說能夠改一下編碼.但筆者試了,貌似不能夠.英文社區相似Stack Overflow,均沒有關於這個問題的解決方法.畢竟人家老外不太關心''咱們本身的事''.因而,爬了半天,沒找到有效的解決辦法.好吧,這是硬傷.固然,大牛們應該是能夠經過更改pygame中源代碼解決的,這不是我能作的事^_^.
#debug:
筆者來了個好玩的方法,應該還有更好的實現方法,我先來厚着臉皮說一下個人debug思路:
首先,當遇到中文名mp3是出現pygame.error 這時,程序出現嚴重錯誤.很天然想到try語句.這樣,當遇到中文名mp3時出現error,自動轉到except內容.筆者想到複製待播放文件到指定目錄,並重命名爲非中文.最後加載此非中文mp3文件,從而繞過了pygame中文識別的硬傷.下面上代碼:
import pygame import shutil path = '一走過的日子-劉德華.mp3' pygame.mixer.init() try: pygame.mixer.music.load(path) pygame.mixer.music.play() except: print('something is wrong~\nbut i see you.') shutil.copyfile(path,'play.mp3') pygame.mixer.music.load('play.mp3') pygame.mixer.music.play()
#運行效果:
此時,程序已經能夠正常播放中文名mp3文件.其實此問題並無從本質上解決pygame中文識別問題,而是繞過了這個問題.這個方法也是有個弊端,就是會產生play.mp3這個文件,在作項目的時候能夠放在緩存目錄裏.
至此,關於解決今天下午遇到的pygame中文識別問題敘述完畢,若有更好的方法,望請評論告知,謝謝.
剛纔看了下python3.3.3 pygame目錄,文件mixer.pyd科普了一下.pyd後綴,發現和dll同樣是二進制文件,更改內容須要反編譯.也就是說python並非徹底開源的.