python-3.x - UnicodeDecodeError:“utf-8”编解码器无法解码位置 10 中的字节 0xa9:无效的起始字节
问题描述
我正在尝试使用music21 库读取 MIDI 音乐文件并对其进行一些处理。我正在使用自定义的read_midi函数,并收到此错误“ UnicodeDecodeError: 'utf-8' codec can't decode byte 0xa9 in position 10: invalid start byte ”
import os
#Array Processing
import numpy as np
#specify the path
path='audio/'
#read all the filenames
files=[i for i in os.listdir(path) if i.endswith(".mid")]
#reading each midi file
notes_array = np.array([read_midi(path+i) for i in files])
这是 read_midi 函数:
def read_midi(file):
print("Loading Music File:",file)
notes=[]
notes_to_parse = None
#parsing a midi file
midi = converter.parse(file)
#grouping based on different instruments
s2 = instrument.partitionByInstrument(midi)
#Looping over all the instruments
for part in s2.parts:
#select elements of only piano
if 'Piano' in str(part):
notes_to_parse = part.recurse()
#finding whether a particular element is note or a chord
for element in notes_to_parse:
#note
if isinstance(element, note.Note):
notes.append(str(element.pitch))
#chord
elif isinstance(element, chord.Chord):
notes.append('.'.join(str(n) for n in element.normalOrder))
return np.array(notes)
请建议我如何摆脱这个错误。
解决方案
我从 music21 Google Groups 得到的答案并解决了我的问题:
您好,感谢您的报告。这是由 6.1.0 中的一项新功能引起的回归,该功能从 MIDI 轨道名称的文本创建乐器对象。它在下一个未发布的版本(可能是 6.2.0)中得到修复,现在可以在 GitHub 上获得。如果安装起来太麻烦,您也可以编辑自己的 music21 副本以应用此处找到的修复:https ://github.com/cuthbertLab/music21/pull/607/files
出于好奇,原始功能错误地假设所有 MIDI 轨道名称都将使用 utf-8 编码。我们发现失败的文件在曲目名称中都有一个版权符号,它们都是由“www.piano-midi.de”创建的。您介意分享一下 MIDI 作家创建了您的文件吗?
另外,我非常感谢您在 Stack Overflow 上分享这个答案,因为我在那里不活跃。
干杯,快乐的音乐,
推荐阅读
- sql - Postgresql JSON 列检查值存在于 json 数组中
- r - R 在具有多个连接和过滤器的 dplyr 上表现不佳
- python - Django - social_auth - 我如何分离 social_auth_facebook_scope 以请求不同的范围
- c++ - WNetAddConnection2 返回错误 86,网络使用工作
- javascript - 从 Firebase 下载时,Promise 停留在待处理状态
- android - 在 PageView 小部件之间颤动插页式广告
- flutter - 如何将参数传递给 Futurebuilder 的未来实例?
- laravel - 如何在 laravel 资源中显示嵌套关系
- java - 为什么 TomlParseResult.get() 仅适用于第一个键
- python - Django - 将表单验证添加到 inlineformset_factory