import pretty_midi # 读取MIDI文件 midi_data = pretty_midi.PrettyMIDI('output18.mid') # 提取音符信息 note_list = [] for instrument in midi_data.instruments: for note in instrument.notes: note_list.append((note.start, note.end, note.pitch)) # 将音符信息保存到文件中 with open('music.notes', 'w') as f: for note in note_list: f.write(f'{note[0]},{note[1]},{note[2]}\n') f.close() # 读取文件中的所有音符 note_list = [] with open('music.notes', 'r') as f: for line in f: start, end, pitch = [float(x) for x in line.strip().split(',')] note_list.append((start, end, pitch)) f.close() # 打印读取的音符列表 print(note_list) if len(note_list) == 0: print("note_list is empty") else: for note in note_list: if len(note) != 3: print("Invalid note format:", note) print("note_list contents:", note_list)
时间: 2024-01-25 10:02:21 浏览: 297
你在读取文件时,将 `f.close()` 放在了 `for` 循环内部,这会导致在第一次循环结束时就关闭了文件,然后再次循环时会出现 I/O 操作错误。你可以将 `f.close()` 移到循环外,或者使用 `with` 语句来自动关闭文件。
以下是修改后的代码示例:
```python
import pretty_midi
# 读取 MIDI 文件
midi_data = pretty_midi.PrettyMIDI('output18.mid')
# 提取音符信息
note_list = []
for instrument in midi_data.instruments:
for note in instrument.notes:
note_list.append((note.start, note.end, note.pitch))
# 将音符信息保存到文件中
with open('music.notes', 'w') as f:
for note in note_list:
f.write(f'{note[0]},{note[1]},{note[2]}\n')
# 读取文件中的所有音符
note_list = []
with open('music.notes', 'r') as f:
for line in f:
start, end, pitch = [float(x) for x in line.strip().split(',')]
note_list.append((start, end, pitch))
# 打印读取的音符列表
print(note_list)
if len(note_list) == 0:
print("note_list is empty")
else:
for note in note_list:
if len(note) != 3:
print("Invalid note format:", note)
print("note_list contents:", note_list)
```
在这个示例中,我们将 `f.close()` 移到了循环外。同时,我们在读取文件时使用了 `with` 语句,这样可以在文件使用完毕后自动关闭文件,避免了手动关闭文件时遗漏的问题。
阅读全文