Python解析XML文件中的某些行,并将该行输出到文本widg

2024-10-01 17:30:06 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要在windows msinfo文件(.nfo)中搜索某些行并将它们打印到文本小部件中。我可以print(line)在文件中的任何一行,我可以将每一行输出到文本小部件,但一旦我尝试指定要输出的行,它就停止工作。我假设这是因为文件是一个XML,但是我看到的python的XML解析工具似乎在寻找data=blah这样的行。当我在txt编辑器中打开它们时,我要查找的条目如下所示:

    <Category name="Disks">
<Data>
<Item><![CDATA[Description]]></Item>
<Value><![CDATA[Disk drive]]></Value>
</Data>
<Data>
<Item><![CDATA[Manufacturer]]></Item>
<Value><![CDATA[(Standard disk drives)]]></Value>
</Data>
<Data>
<Item><![CDATA[Model]]></Item>
<Value><![CDATA[TOSHIB  MK1652GSX SCSI Disk Device]]></Value>
</Data>
<Data>
<Item><![CDATA[Bytes/Sector]]></Item>
<Value><![CDATA[512]]></Value>
</Data>
<Data>
<Item><![CDATA[Media Loaded]]></Item>
<Value><![CDATA[Yes]]></Value>
</Data>
<Data>
<Item><![CDATA[Media Type]]></Item>
<Value><![CDATA[Fixed hard disk]]></Value>
</Data>
<Data>
<Item><![CDATA[Partitions]]></Item>
<Value><![CDATA[2]]></Value>
</Data>
<Data>
<Item><![CDATA[SCSI Bus]]></Item>
<Value><![CDATA[1]]></Value>
</Data>
<Data>
<Item><![CDATA[SCSI Logical Unit]]></Item>
<Value><![CDATA[0]]></Value>
</Data>
<Data>
<Item><![CDATA[SCSI Port]]></Item>
<Value><![CDATA[0]]></Value>
</Data>
<Data>
<Item><![CDATA[SCSI Target ID]]></Item>
<Value><![CDATA[0]]></Value>
</Data>
<Data>
<Item><![CDATA[Sectors/Track]]></Item>
<Value><![CDATA[63]]></Value>
</Data>
<Data>
<Item><![CDATA[Size]]></Item>
<Value><![CDATA[149.05 GB (160,039,272,960 bytes)]]></Value>
</Data>
<Data>
<Item><![CDATA[Total Cylinders]]></Item>
<Value><![CDATA[19,457]]></Value>
</Data>
<Data>
<Item><![CDATA[Total Sectors]]></Item>
<Value><![CDATA[312,576,705]]></Value>
</Data>
<Data>
<Item><![CDATA[Total Tracks]]></Item>
<Value><![CDATA[4,961,535]]></Value>
</Data>
<Data>
<Item><![CDATA[Tracks/Cylinder]]></Item>
<Value><![CDATA[255]]></Value>
</Data>
<Data>
<Item><![CDATA[Partition]]></Item>
<Value><![CDATA[Disk #1, Partition #0]]></Value>
</Data>
<Data>
<Item><![CDATA[Partition Size]]></Item>
<Value><![CDATA[117.19 GB (125,830,301,184 bytes)]]></Value>
</Data>
<Data>
<Item><![CDATA[Partition Starting Offset]]></Item>
<Value><![CDATA[32,256 bytes]]></Value>
</Data>
<Data>
<Item><![CDATA[Partition]]></Item>
<Value><![CDATA[Disk #1, Partition #1]]></Value>
</Data>
<Data>
<Item><![CDATA[Partition Size]]></Item>
<Value><![CDATA[31.85 GB (34,200,714,240 bytes)]]></Value>
</Data>
<Data>
<Item><![CDATA[Partition Starting Offset]]></Item>
<Value><![CDATA[125,830,333,440 bytes]]></Value>
</Data>
<Data>

我发现一个post在问我想要什么,但解决方案不起作用。这个ET.解析找不到:

^{pr2}$

当我使用上述方法时:

"C:\Program Files (x86)\Python35-32\python.exe" "D:/MY STUFF/Programming/Python/testing.py" Traceback (most recent call last): File "D:/MY STUFF/Programming/Python/testing.py", line 3, in tree = ET.parse(file) AttributeError: module 'xml.etree' has no attribute 'parse'

Process finished with exit code 1

这是我的代码片段:

try:
    u = find("msinfo.nfo", s)
    for i in u:
        cpfotxt.insert('end', i + "\n")
        cpfotxt.yview(END)
        cpfotxt.insert('end', "================================= \n")
        with open(i, "r") as f:
            r = f.readlines()
            for line in r:
                if "Model" in line:
                    cpfotxt.insert('end', line + "\n")

如果我删除if "Model" in line:,那么它将把所有内容都转储到文本小部件中。在

这是在windows上正常打开时的外观:

enter image description here

关于如何从nfo/XML文件中提取行有什么建议吗?在

另外,当从xml打印行时,字体更大,并且是双倍行距。我如何使这行打印的方式,它将从一个普通的txt文件?在


Tags: 文件in文本databytesvalue部件line
2条回答

因此,您需要了解XML的结构,然后使用要查找的实际标记,而不是“Data”

    item = element.find('Item') 
    print(item.tag ,":",item.text)
    value = element.find('Value') 
    print(value.tag ,":",value.text)

您的实际问题是需要更改所使用的导入。在

^{pr2}$

https://docs.python.org/2/library/xml.etree.elementtree.html

编辑:使用结构化的方式,您可以通过

for data in root.findall('Data'):
    item = data.find('Item') 
    print(item.tag ,":",item.text)
    value = data.find('Value') 
    print(value.tag ,":",value.text)

现在,了解如果“Data”标记不在根级别,那么您需要根目录。查找()直到你能做到。换句话说,如果这些“Data”标记包含在一些父标记中,则需要根目录。查找(“家长标签”),希望你能理解它的要点

Edit2:看了我自己的msinfo.nfo公司文件和这个有效:

disks = root.find(".//Category[@name='Disks']")

for disk in disks:
    item = disk.find('Item')
    print(item.tag ,":",item.text)
    value = disk.find('Value')
    print(value.tag ,":",value.text)

注意:这使用XPath语法来查找元素,它只在ElementTree1.3(python2.7及更高版本)中可用。您还可以通过遵循XML的结构并遍历树直到到达磁盘,来强制执行它。路径为System Summary->;Components->;Storage->;Disks和under Disks是那些以Item和Value作为子级的数据元素。在

这是我的代码和您的示例数据,我知道它可以写得更好,但我认为这解决了您的问题:)
你必须找到根(xml),然后迭代它的文本!您也可以使用其他方法,如iterfind来获得更好的解决方案

xml_file  = "<xml><Item><![CDATA[Model]]></Item><Value><![CDATA[TOSHIB  MK1652GSX SCSI Disk Device]]></Value></xml>"
from xml.etree import ElementTree
root = ElementTree.fromstring(xml_file)

start = root.itertext()

while True:
    try:
        print start.next()
    except StopIteration:
        break

输出如下:

^{pr2}$

相关问题 更多 >

    热门问题