在 Python 中从文件路径解析 MusicXML 文件时遇到麻烦

Trouble Parsing MusicXML Files from File Paths in Python

提问人:Saar Kol 提问时间:10/20/2023 最后编辑:Saar Kol 更新时间:10/21/2023 访问量:143

问:

我正在做一个Python项目,我需要解析MusicXML文件。到目前为止,我一直在手动将这些文件中的内容复制到字符串变量中,并且代码运行良好。但是,我想通过允许它接受文件路径来使我的脚本更加用户友好。

以下是我尝试从给定文件路径解析文件的方法:

xml_file_path = r"C:\Users\myfilepath.musicxml"
tree = ET.parse(xml_file_path)
root = tree.getroot()
xml_content = ET.tostring(root, encoding="utf-8").decode("utf-8")

我遇到的问题是,当我使用文件路径运行代码时,它似乎无法按预期工作。我没有收到任何错误消息,但解析结果不是我想要的,而且它们通常看起来不完整。

如果有人能帮助我了解这里可能出了什么问题,或者是否有更好的方法可以直接从 Python 中的文件路径解析 MusicXML 文件,我将不胜感激。任何提示、建议或指导都将非常有帮助。

非常感谢您抽出时间接受采访!

python xml xml 解析 elementtree musicxml

评论

2赞 LMC 10/20/2023
“它们通常看起来不完整”,如何???
0赞 D.L 10/20/2023
如果您使用的是 Windows,则使用(双反斜杠)\\ 或(正斜杠)/...
1赞 balderman 10/21/2023
共享文件并解释您需要从此文件中获取哪些信息myfilepath.musicxml

答:

0赞 Hermann12 10/20/2023 #1

你不解释,你喜欢解析什么,或者你喜欢用内容做什么?

import xml.etree.ElementTree as ET
import os 

def xml_parse(filename):
    tree = ET.parse(filename)
    root = tree.getroot()
    
    for elem in root.iter():
        print(elem.tag, elem.attrib, elem.text)



if __name__ == "__main__": 
    # insert the path where you are interessted e.g.
    # path = r"C:\Users\sselt\Documents\blog_demo" 
    path = r"."
    
    for (root,dirs,files) in os.walk(path, topdown=True): 
        for filename in files:
            if filename.endswith('.xml'):
                print(filename)
                xml_parse(filename)

你可以让 pathlib() 代替 os.walk() 来完成这项工作:

import xml.etree.ElementTree as ET
from pathlib import Path

def xml_parse(filename):
    print(f"File: {filename}")
    tree = ET.parse(filename)
    root = tree.getroot()
    
    for elem in root.iter():
        if elem.tag == "score-instrument" and elem.get('id') == 'P1-I1':
            print(f"{elem.find('./instrument-name').text:>17}")
        
if __name__ == "__main__": 
    # insert the path where you are interessted e.g.
    p = Path('.')
    print(p.cwd())
    print(Path.home())
    print(Path.home().parent)
    l = list(p.glob('*.xml'))

    for filename in l:
        xml_parse(filename)

我的MusicXML文件的输出:

File: musicXML.xml
      Wood Blocks
File: test.xml
File: outxml.xml
File: helloWorld.xml

应该可以在 Linux 和 Windows 上运行。

评论

0赞 Saar Kol 10/21/2023
我想在 MusicXML 文件中找到一个具有特定属性的仪器。代码如下:python # Parse the XML root = ET.fromstring(xml_content) # Find the score-instrument with id "P10-I42" target_id = "P10-I42" instrument_name = None for score_instrument in root.findall(".//score-instrument"): if score_instrument.get("id") == target_id: instrument_name = score_instrument.find("instrument-name").text break if instrument_name: print(f"The instrument name for id {target_id} is: {instrument_name}")
0赞 Hermann12 10/21/2023
@SaarKol我已经编辑了我的示例。请接受答案,如果有帮助,谢谢。
0赞 mzjn 10/22/2023
@SaarKol:请不要在评论中发布代码。改为编辑问题(确保提供适当的最小可重现示例)。
0赞 mzjn 10/22/2023
@Hermann12:不要回答不清楚的问题。相反,请请求一个最小的可重现示例