TypeError: индексы индексов должны быть целыми, а не str с xmltodict:

У меня есть этот XML- файл:

<?xml version="1.0"?> <toolbox tool_path="/galaxy/main/shed_tools"> <section id="snpeff" name="snpEff" version=""> <tool file="toolshed.g2.bx.psu.edu/repos/pcingola/snpeff/c052639fa666/snpeff/snpEff_2_1a/snpEff_2_1a/galaxy/snpSift_filter.xml" guid="toolshed.g2.bx.psu.edu/repos/pcingola/snpeff/snpSift_filter/1.0"> <tool_shed>toolshed.g2.bx.psu.edu</tool_shed> <repository_name>snpeff</repository_name> <repository_owner>pcingola</repository_owner> <installed_changeset_revision>c052639fa666</installed_changeset_revision> <id>toolshed.g2.bx.psu.edu/repos/pcingola/snpeff/snpSift_filter/1.0</id> <version>1.0</version> </tool> <tool file="toolshed.g2.bx.psu.edu/repos/pcingola/snpeff/c052639fa666/snpeff/snpEff_2_1a/snpEff_2_1a/galaxy/snpEff.xml" guid="toolshed.g2.bx.psu.edu/repos/pcingola/snpeff/snpEff/1.0"> <tool_shed>toolshed.g2.bx.psu.edu</tool_shed> <repository_name>snpeff</repository_name> <repository_owner>pcingola</repository_owner> <installed_changeset_revision>c052639fa666</installed_changeset_revision> <id>toolshed.g2.bx.psu.edu/repos/pcingola/snpeff/snpEff/1.0</id> <version>1.0</version> </tool> <tool file="toolshed.g2.bx.psu.edu/repos/gregory-minevich/check_snpeff_candidates/22c8c4f8d11c/check_snpeff_candidates/checkSnpEffCandidates.xml" guid="toolshed.g2.bx.psu.edu/repos/gregory-minevich/check_snpeff_candidates/check_snpeff_candidates/1.0.0"> <tool_shed>toolshed.g2.bx.psu.edu</tool_shed> <repository_name>check_snpeff_candidates</repository_name> <repository_owner>gregory-minevich</repository_owner> <installed_changeset_revision>22c8c4f8d11c</installed_changeset_revision> <id>toolshed.g2.bx.psu.edu/repos/gregory-minevich/check_snpeff_candidates/check_snpeff_candidates/1.0.0</id> <version>1.0.0</version> </tool> </section> ... 

Я попытался проанализировать вышеупомянутый файл следующим образом:

 import xmltodict # wget -c https://raw.githubusercontent.com/galaxyproject/usegalaxy-playbook/c55aa042825fe02ef4a02d958eb811adba8ea45f/files/galaxy/usegalaxy.org/var/shed_tool_conf.xml if __name__ == '__main__': with open('tests/shed_tool_conf.xml') as fd: doc = xmltodict.parse(fd.read()) tools_section = doc['toolbox']['section']['@name'] print tools_section 

Однако у меня есть следующая ошибка:

 Traceback (most recent call last): File "importTools2Galaxy.py", line 15, in <module> tools_section = doc['toolbox']['section']['@name'] TypeError: list indices must be integers, not str 

Что я сделал не так?

    В вашем XML есть много элементов section , вы должны сделать что-то вроде

     tools_section = doc['toolbox']['section'][0] 

    где 0 – индекс раздела, который вы хотите прочитать. Если индекс не фиксирован, вы можете перебирать их, как for section in doc['toolbox']['section']: ... и останавливаться в разделе, содержимое которого соответствует вашим критериям … или просто что-то делать с каждым разделов.

    Это связано с тем, что doc['toolbox']['section'] возвращает list разделов, поэтому вам нужно выполнить итерацию по каждому разделу, чтобы получить значение @name . Вы можете проверить, @name ли @name в данном разделе. Для этого вы можете использовать .get вместо ['@name']

     with open('tests/shed_tool_conf.xml') as fd: doc = xmltodict.parse(fd.read()) for section in doc['toolbox']['section']: tools_section = section.get('@name') print tools_section