pygame加载中文名mp3文件出现error

  

  好一阵子没有写东西了,最近几天在做一个基于Python pygame的音乐播放器,本来想做完了,再来发篇文章的,可越做越深,框架大致出来了,考虑周期比较长,也可能是我个人问题,做得比较慢.下面来谈谈pygame.mixer.music.load()加载中文名的mp3文件问题.

(发表时间2017-03-30 22:45:58 原创链接http://www.cnblogs.com/dearvee/p/6649055.html)


#前言: 

  今天刚刚做了个音乐列表,但笔者发现在指定目录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并不是完全开源的.

时间: 2024-10-26 17:01:24

pygame加载中文名mp3文件出现error的相关文章

Pygame 加载音频

Python Learning:Pygame 加载音频 Python 中自带的 winsound 模块 winsound 模块中 Beep 方法可以调用系统的蜂鸣器,接受一个为 frequency 的频率参数(范围在 37 到 36727 之间)和一个 duration 的时长参数.频率太低就难以听到. def beep( freq, dura ): freq = math.floor( freq ) winsound.Beep( freq, dura ) 另外 winsound 还提供了对 w

ios UIWebView 加载网页、文件、 html

UIWebView  是用来加载加载网页数据的一个框.UIWebView可以用来加载pdf word doc 等等文件 生成webview 有两种方法,1.通过storyboard 拖拽 2.通过alloc init 来初始化 创建webview,下列文本中 _webView.dataDetectorTypes = UIDataDetectorTypeAll; 是识别webview中的类型,例如 当webview中有电话号码,点击号码就能直接打电话 - (UIWebView *)webView

webpack入坑之旅(五)加载vue单文件组件

这是一系列文章,此系列所有的练习都存在了我的github仓库中vue-webpack,在本人有了新的理解与认识之后,会对文章有不定时的更正与更新.下面是目前完成的列表: webpack入坑之旅(一)不是开始的开始 webpack入坑之旅(二)loader入门 webpack入坑之旅(三)webpack.config入门 webpack入坑之旅(四)扬帆起航 webpack入坑之旅(五)加载vue单文件组件 webpack入坑之旅(六)配合vue-router实现SPA 需要什么? 在经过前面的四

xBIM 实战01 在浏览器中加载IFC模型文件

一.创建Web项目 打开VS,新建Web项目,选择 .NET Framework 4.5 选择一个空的项目 新建完成后,项目结构如下: 二.添加webServer访问文件类型 由于WexXplorer 加载的是 .wexBIM格式的文件或者文件流,所以需要在Web.config文件中添加如下配置 <system.webServer> <security> <requestFiltering> <requestLimits maxAllowedContentLeng

ThinkPHP 3.2.3 自动加载公共函数文件的方法

方法一.加载默认的公共函数文件 在 ThinkPHP 3.2.3 中,默认的公共函数文件位于公共模块 ./Application/Common 下,访问所有的模块之前都会首先加载公共模块下面的配置文件(Conf/config.php)和公共函数文件(Common/function.php),即默认的公共函数文件为 ./Application/Common/Common/function.php. 例如,在 ./Application/Common/Common 下新建 function.php,

Struts2的国际化(二)-利用超链接实现动态加载国际化资源文件

原理:程序是根据Locale来确定国际化资源文件,因此关键之处在于知道 Struts2 框架是如何确定 Local 对象的 ! 由于Struts2 使用 i18n 拦截器处理国际化,并且将其注册在默认的拦截器中,因此,可以通过阅读 I18N 拦截器知道. 具体确定 Locale 对象的过程: > Struts2 使用 i18n 拦截器 处理国际化,并且将其注册在默认的拦截器栈中 > i18n拦截器在执行Action方法前,自动查找请求中一个名为 request_locale 的参数. 如果该参

spring不断重新加载所有类文件

第一次写博文,可能有点兴奋和啰嗦,先说说使用的环境:resin+spring+struts,服务器是测试用的,由运维同事维护,里面有几个项目,仅供开发的同事修改. 事情从昨天下午开始, 查看测试服务器log时,发现spring不断的加载类文件,但却没有任何错误信息提示,初步判断应该是某开发的同事修改了配置文件导致的问题,但看了一遍没发现什么问题,难道服务器作了什么动作?于是问了一名运维同事,说没作什么修改,一听心血来潮,因为这个问题可以加入我的问题库里面. 因为配置正常,怀疑是某些类加载不正常导

PHP加载另一个文件类的方法

加载另一个文件类的方法 当前文件下有a.php 和b.php,想要在class b中引入class a <?php    class a    {        public $name = 'zhouqi';        public function say()        {            echo 'hello '.$this->name;        }    } <?php    class b    {        //require('a.php'); 错

使用jQuery动态加载js脚本文件的方法

动态加载Javascript是一项非常强大且有用的技术.这方面的主题在网上已经讨论了不少,我也经常会在一些个人项目上使用RequireJS和Dojo加载js 它们很强大,但有时候也会得不偿失.如果你使用的是jQuery,它里面有一个内置的方法可以用来加载单个js文件.当你需要延迟加载一些js插件或其它类型的文件时,可以使用这个方法.下面就介绍一下如何使用它! 一.jQuery getScript()方法加载JavaScript jQuery内置了一个方法可以加载单一的js文件:当加载完成后你可以