我对python比较陌生。我需要打开一个文件,但有些文件的名称是俄语,类似于
playsound('C:/Users/User/Documents/Audacity/Секретный звук.wav')
在这里它给了我一个错误
File "C:\Users\User\Desktop\Неизвестный.py", line 9, in <module>
playsound('C:/Users/User/Documents/Audacity/Секретный звук.wav')
File "C:\Users\User\AppData\Local\Programs\Python\Python36\lib\site-packages\playsound.py", line 35, in _playsoundWin
winCommand('open "' + sound + '" alias', alias)
File "C:\Users\User\AppData\Local\Programs\Python\Python36\lib\site-packages\playsound.py", line 30, in winCommand
'\n ' + errorBuffer.value.decode())
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xc4 in position 0: invalid continuation byte
我知道您可以将此音频与代码一起放入同一个文件夹并将其重命名为英语和数字,但仍然如何在文件路径中使用俄语中的 python 中的文件本身的名称?提前致谢。
tl;dr :从模块作者的评论来看,截至 2021 年 7 月 15 日,该问题应该已经修复
这是 playsound 库中的错误。让我们看一下代码:
第一个问题是它被取走
getfilesystemencoding()(在Windows 10下,例如,它是utf-8),然后用这种编码对命令进行编码(其中一部分是你到带有俄罗斯字母的文件的路径)。我们得到一组 utf-8 编码的字节。然后我们将这组字节传递给函数,其名称中的mciGetErrorStringA字母A告诉我们该函数仅支持单字节编码(与W末尾有字母的函数不同——它们支持 utf-16)。该函数不起作用,返回错误代码。然后它起作用了
if,我们尝试获取错误的文本(再次,使用函数的 ANSI 版本mciGetErrorString)。此外,最初以 utf-8 编码的命令使用默认编码进行解码(这次很幸运 - 结果也是 utf-8)。接下来,获取带有错误文本的缓冲区,它也是从默认编码解码的(在您的情况下,它很可能是 utf-8),但是由于 该缓冲区的内容由专为单字节编码设计的函数填充,然后缓冲区突然包含 cp1251 编码的俄语文本。我们从问题中得到一个错误。
固定在膝盖上:
基本上,您可以向库添加拉取请求。
更新
我自己测试了一下,做了一些更正,函数的完整代码
_playsoundWin:更新 2
拉取请求:https ://github.com/TaylorSMarks/playsound/pull/32
我的修复包分支:https
://github.com/insolor/playsound 您可以直接从 github 更新包(需要安装git):
更新 3
从模块作者的评论来看,他发布了他的修复版本。我没有测试过,但我认为修复是有效的,所以我删除了我的 fork。我还关闭了拉取请求,但如果您愿意,您可以查看其中的更改。
我对 windows 不是很好,但是(恕我直言)问题是 python 程序(从版本 3 开始)在 UTF-8 中工作,并且 windows 驱动器上的目录名称是用 cp1251 格式编写的。
可能值得尝试类似的东西: