提问人:Saar Kol 提问时间:10/20/2023 最后编辑:Saar Kol 更新时间:10/21/2023 访问量:143
在 Python 中从文件路径解析 MusicXML 文件时遇到麻烦
Trouble Parsing MusicXML Files from File Paths in Python
问:
我正在做一个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 文件,我将不胜感激。任何提示、建议或指导都将非常有帮助。
非常感谢您抽出时间接受采访!
答:
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:不要回答不清楚的问题。相反,请请求一个最小的可重现示例。
评论
myfilepath.musicxml