Seite 1 von 1

ImportError: No module named etree.ElementTree

Verfasst: Donnerstag 19. Dezember 2019, 22:58
von Richard Sturmer
Guten Abend!!
Ich habe ein kleines Problem, und zwar möchte ich gerne die Datei create_instruments_train_txt.py ausführen. Der Inhalt sieht folgendermaßen aus:

Code: Alles auswählen

import os
import random
import xml.etree.ElementTree as etree
from string import digits

path = '/home/richard/MII/datasets/pascal/VOCdevkit/VOC2008/Annotations'
directoy = os.listdir(path)

list_xmls = []
set_instruments = set([])

for xml_file in directoy:

    base = os.path.splitext(xml_file)[0]
    list_xmls.append(base)
    file_path = os.path.join(path, xml_file)
    tree = etree.parse(file_path)
    root = tree.getroot()

    for object in root.findall('object'):
        name = object.find('name')
        set_instruments.add(name.text)
        
random.shuffle(list_xmls)

for instrument in set_instruments:
    txt_path = os.path.join('/home/richard/MII/datasets/pascal/VOCdevkit/VOC2008/ImageSets/Main/', instrument + '_train.txt')
    file = open(txt_path, 'a+')
    
    for xml in list_xmls:
        remove_digits = str.maketrans('', '', digits)
        res = xml.translate(remove_digits)
        if (res == instrument):
            file.write(xml + ' 1 \n')
        else:
            file.write(xml + ' -1 \n')
    file.close()
Ich führe im terminal den Befehl "python create_instruments_train_txt.py -i /home/richard/MII/datasets/pascal/VOCdevkit/VOC2008/Annotations -o /home/richard/MII/datasets/pascal/VOCdevkit/VOC2008/ImageSets/Main/" aus. Allerdings kommt hier die Fehlermeldung :
Traceback (most recent call last):
File "create_instruments_train_txt.py", line 3, in <module>
import xml.etree.ElementTree as etree
ImportError: No module named etree.ElementTree

Könnt ihr mir hier weiterhelfen?
Vielen lieben Dank im Voraus!

Re: ImportError: No module named etree.ElementTree

Verfasst: Donnerstag 19. Dezember 2019, 23:57
von Sirius3
Noch schlimmer als falsch benannte Variablennamen sind eigentlich nur noch welche mit Rechtschreibfehler: ›directoy‹? Welches Spielzeug ist das? Es ist aber auch kein Directory, kein Verzeichnis, sondern der Inhalt eines Verzeichnisses, also Dateinamen: ›filenames‹.
In Variablennamen sollten auch nicht der Typ vorkommen, weil sich der leicht mal ändert.
Der Filemode 'a+' ist eigentlich wie alle Modi mit + bei Textdateien unsinnig.
Heutzutage würde man statt ›os‹ ›pathlib‹ benutzen.
Ein paar Funktionen würden auch nicht schaden:

Code: Alles auswählen

import random
from pathlib import Path
import xml.etree.ElementTree as etree
from string import digits

BASEPATH = Path('/home/richard/MII/datasets/pascal/VOCdevkit/VOC2008')

def read_xml_files(path):
    filenames = []
    instruments = {}
    for xml_filename in path.iterdir():
        filenames.append(xml_filename.stem)
        tree = etree.parse(xml_filename)
        root = tree.getroot()
        for object in root.findall('object'):
            instruments.add(object.findtext('name'))
    return filenames, instruments

def main():
    filenames, instruments = read_xml_files(BASEPATH / 'Annotations'):
    random.shuffle(filenames)
    for instrument in instruments:
        text_path = BASEPATH / 'ImageSets' / 'Main' / instrument + '_train.txt'
        with text_path.open('a') as output:
            for xml_filename in filenames:
                remove_digits = str.maketrans('', '', digits)
                result = xml_filename.translate(remove_digits)
                output.write(f"{xml_filename} {1 if result == instrument else -1} \n")

if __name__ == '__main__':
    main()
Achja, zum Problem: Du hast eine Datei xml.py im selben Verzeichnis liegen. Das überdeckt das Python-Paket mit selben Namen.

Re: ImportError: No module named etree.ElementTree

Verfasst: Freitag 20. Dezember 2019, 00:24
von Richard Sturmer
vielen Dank! es funktioniert :-)