Kann mir einer mit meinem Code für Python helfen?

Mein Code zum Bearbeiten von einer Datei - (Computer, Python, XML) RUN des Codes - (Computer, Python, XML)

2 Antworten

import xml.etree.ElementTree as ET

tree = ET.parse('ARandomStateChart.sct')
root = tree.getroot()

for styles in root.iter('styles'):
#Spart einmal "nachschlagen" im "dict" styles.attrib
fillColor = styles.attrib.get('fillColor')
if fillColor is not None:
#Neuen Wert zuweisen
styles.attrib['fillColor'] = 'whatever...'

#Speichern des veränderten "ElementTree"
tree.write('ARandomStateChart_modified.sct')

Okay erstmal danke für die Antwort, jedoch wenn ich diesen Code ausführe gibt der Interpreter nichts aus. An was kann das liegen?

 

0
@KratzAb

Weil er nix ausgibt... ;)

Etwas genauer: Der Code enthält weder "print" noch "sys.stdout.write" o.ä....

Die Ausgabe findet in der Datei "ARandomStateChart_modified.sct" statt (siehe letzte Zeile).

Haupsächlich geht es aber auch um diese Zeile:

styles.attrib['fillColor'] = 'whatever...'

Dabei das 'whatever...' durch den neuen Wert ersetzen, dann läufts...

Und wenn du ne Ausgabe auf der Konsole o.ä. benötigst, füg einfach an entsprechender Stelle ein "print" ein.

1

Einfach Klasse, danke

 

0

Was spricht gegen:

styles.attributes.set( 'fillColor', 123 )

Zumindest steht das so in der Doku, gleich hinter get():

https://docs.python.org/3/library/xml.etree.elementtree.html#xml.etree.ElementTree.Element

Folgende Fehlermeldung:

Traceback (most recent call last):
  File "C:/Users/z003urvs/AppData/Local/Programs/Python/Python36-32/Scripts/XML.py", line 10, in <module>
    styles.attributes.set( 'fillColor', 123 )
AttributeError: 'xml.etree.ElementTree.Element' object has no attribute 'attributes'

0
@KratzAb

Tippfehler: es heißt natürlich attrib — genau wie in Deinem Code

0

ja okay nun folgendes Problem xD :

Traceback (most recent call last):
  File "C:/Users/z003urvs/AppData/Local/Programs/Python/Python36-32/Scripts/XML.py", line 10, in <module>
    styles.attrib.set( 'fillColor', 123 )
AttributeError: 'dict' object has no attribute 'set'

0

Zumindest steht das so in der Doku, gleich hinter get()

Jep... Aber nicht als Methode von "Element.attrib" sondern als Methode von "Element"...

"Element.attrib" ist nämlich ein "dict" und das hat keine Methode namens "set"...

2
@Isendrak

Alles klar! Da habe ich diesen Text aus der Doku missverstanden:

The following dictionary-like methods work on the element attributes.

Also sollte man

    styles.set( 'fillColor', 123 )    
statt
    styles.attrib['fillColor'] = 123

und

    styles.get( 'fillColor' )
statt
    styles.attrib['fillColor']

schreiben.

Dass styles.attrib.get() aus der Frage auch funktioniert, liegt nur daran, dass get() in Element und dict definiert ist und beide Funktionen das gleiche tun.

0
@ralphdieter

Fast... ;)

styles.set( 'fillColor', 123 )

und

styles.attrib['fillColor'] = 123

sind äquivalent (siehe Anmerkung), genau wie

styles.get( 'fillColor' )

und

styles.attrib['fillColor']

Anmerkung (die vorhin erwähnte): Der Unterschied ist der, dass beim Direktzugriff auf das Dictionary (Element.attrib[]), wenn das entsprechende Attribut nicht existiert, eine Exception geworfen wird, während bei (Element.get) festgelegt werden kann, dass z.B. None, 0 oder auch "huselwusel" ;) zurückgegeben wird, falls das Attribut nicht existiert.

Anmerkung zur Anmerkung: Es kann auch sein, dass es noch ein paar weitere Unterschiede gibt, die im Verborgenen der internen Abläufe liegen, aber im Groben kann man sagen, dass beide Verfahren sich nicht in relevantem Maße unterscheiden.[citation needed] ;)

1
@Isendrak

Dann sind wir ja einer Meinung — wobei die Doku dazu rät, die direkte Verwendung von attrib möglichst zu vermeiden.

0

Was möchtest Du wissen?