ImportError: No module named etree.ElementTree

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Richard Sturmer
User
Beiträge: 2
Registriert: Donnerstag 19. Dezember 2019, 22:52

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!
Sirius3
User
Beiträge: 18272
Registriert: Sonntag 21. Oktober 2012, 17:20

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.
Richard Sturmer
User
Beiträge: 2
Registriert: Donnerstag 19. Dezember 2019, 22:52

vielen Dank! es funktioniert :-)
Antworten