2016-08-03 6 views
0

Ich versuche herauszufinden, warum mein Code-Verhalten von der normalen Ausführung unterscheidet. Ich habe gesehen, aber es ist nicht mein Fall:Debug-Verhalten unterscheidet sich von der normalen Ausführung in Python

What to do, if debug behaviour differs from normal execution?

python2.7 using debug behave different then without debug

Ich bin ein XML-Dokument zu einem Datenrahmen parsen, so kann ich in eine csv konvertieren oder Excel Datei. Bei normaler Ausführung wird nur der letzte "CPE" des Knotens "LOCALIDADE" analysiert.

Dies ist ein Teil meiner XML-Datei:

<DISTRITO xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <NOME_DISTRITO>BRAGANCA</NOME_DISTRITO> 

    <CONCELHO> 
    <NOME_CONCELHO>ALFANDEGA DA FE</NOME_CONCELHO> 
    <FREGUESIA> 
     <NOME_FREGUESIA>AGROBOM</NOME_FREGUESIA> 
     <LOCALIDADE> 
     <NOME_LOCALIDADE>AGROBOM</NOME_LOCALIDADE> 
     <CODIGO_POSTAL>5350</CODIGO_POSTAL> 
     <CPE>PT2000022152377DE</CPE> 
     <CPE>PT2000022152388XX</CPE> 
     <CPE>PT2000022152399XK</CPE> 
     <CPE>PT2000022152402BR</CPE> 
     <CPE>PT2000022152424NT</CPE> 
     </LOCALIDADE> 
    </FREGUESIA> 

    <FREGUESIA> 
     <NOME_FREGUESIA>ALFANDEGA DA FE</NOME_FREGUESIA> 
     <LOCALIDADE> 
     <NOME_LOCALIDADE>ALFANDEGA DA FE</NOME_LOCALIDADE> 
     <CODIGO_POSTAL>5350</CODIGO_POSTAL> 
     <CPE>PT2000022153052QF</CPE> 
     <CPE>PT2000022153085VV</CPE> 
     <CPE>PT2000022153108HV</CPE> 
     <CPE>PT2000022153119LM</CPE> 
     </LOCALIDADE> 
    </FREGUESIA> 
    </CONCELHO> 
</DISTRITO> 

Dieser Code funktioniert für mich, wenn ich es bin Debuggen:

import xml.etree.ElementTree as et 
import pandas as pd 

path = '/Path/toFile.xml' 
data = [] 
for (ev,el) in et.iterparse(path): 
     print (el.tag, el.text)   
     if el.tag == 'NOME_DISTRITO': nome = el.text 
     if el.tag == 'NOME_CONCELHO': nc = el.text 
     if el.tag == 'NOME_FREGUESIA': nf = el.text 
     if el.tag == 'NOME_LOCALIDADE': nl = el.text 
     if el.tag == "LOCALIDADE": 
      inner = {} 
      inner['NOME_DISTRITO'] = nome 
      inner['NOME_CONCELHO'] = nc 
      inner['NOME_FREGUESIA'] = nf    
      for i in el:        
       print (i.tag,i.text) 
       print(data) 
       inner[i.tag] = i.text 
       if inner.has_key('CPE'): 
        data.append(inner) 

df = pd.DataFrame(data) 
df.to_csv('/Users/DanielMelo/Documents/Endesa/Portugal/CPE.csv',columns=['CPE','NOME_CONCELHO','NOME_FREGUESIA', 
            'NOME_LOCALIDADE','CODIGO_POSTAL']) 

aber dies ist das Ergebnis, wenn ich mit dem normalen Ausführung auszuführen:

CPE NOME_CONCELHO NOME_FREGUESIA NOME_LOCALIDADE CODIGO_POSTAL 
PT2000022152424NT ALFANDEGA DA FE AGROBOM AGROBOM 5350 
PT2000022152424NT ALFANDEGA DA FE AGROBOM AGROBOM 5350 
PT2000022152424NT ALFANDEGA DA FE AGROBOM AGROBOM 5350 
PT2000022152424NT ALFANDEGA DA FE AGROBOM AGROBOM 5350 
PT2000022152424NT ALFANDEGA DA FE AGROBOM AGROBOM 5350 
PT2000022153119LM ALFANDEGA DA FE ALFANDEGA DA FE ALFANDEGA DA FE 5350 
PT2000022153119LM ALFANDEGA DA FE ALFANDEGA DA FE ALFANDEGA DA FE 5350 
PT2000022153119LM ALFANDEGA DA FE ALFANDEGA DA FE ALFANDEGA DA FE 5350 
PT2000022153119LM ALFANDEGA DA FE ALFANDEGA DA FE ALFANDEGA DA FE 5350 

Ich weiß nicht, ob es ein Problem sein könnte, wenn ich das Diktat an meine Liste angehängt habe, oder irgendeine Art von Konflikt wh de es versucht, in csv zu konvertieren (was ich nicht denke, ist der Fall).

Aber wie gesagt, es funktioniert und ich habe das Ergebnis, dass ich will, wenn ich Debugging bin, so kann ich nicht sehen, was das Problem ist.

Antwort

2

Sie fügen wiederholt das gleiche Wörterbuch der Liste hinzu. Python-Container speichern Referenzen, keine Kopien, so dass jede Änderung, die Sie an diesem Wörterbuch machen, wird durch alle diese Referenzen sichtbar sein.

Ja, das Drucken dieses Wörterbuchs vor der Änderung in einer nächsten Schleifeniteration zeigt nicht die Änderung an, die Sie in der nächsten Iteration vornehmen. Sie drucken schließlich nicht die Wörterbücher, die Sie hinzugefügt haben, sodass diese Referenzen nicht die Änderung widerspiegeln.

eine Kopie des Wörterbuch hinzufügen:

>>> data = [] 
>>> inner = {'foo': 'bar'} 
>>> data.append(inner) 
>>> data 
[{'foo': 'bar'}] 
>>> inner['foo'] = 'spam' 
>>> inner 
{'foo': 'spam'} 
>>> data # note that the data list *also* changed! 
[{'foo': 'spam'}] 
>>> data = [] # start anew 
>>> inner = {'foo': 'bar'} 
>>> data.append(inner.copy()) # add a (shallow) copy 
>>> data 
[{'foo': 'bar'}] 
>>> inner['foo'] = 'spam' 
>>> data 
[{'foo': 'bar'}] 
>>> data.append(inner.copy()) 
>>> data 
[{'foo': 'bar'}, {'foo': 'spam'}] 
+0

beiseite: Performance-Problem: eine Menge 'if' gedreht werden kann

if inner.has_key('CPE'): data.append(inner.copy()) 

Sie einfach Ihr Problem in einer interaktiven Sitzung wiedergeben kann in 'elif' könnte die Geschwindigkeit viel besser sein. –

+0

Also jedes Mal, wenn ich ein Wörterbuch an eine Liste anhängen möchte, muss ich eine Kopie anhängen? nicht das gleiche Wörterbuch mit unterschiedlichem Wert, aber eine Kopie? Danke für Ihre Hilfe! Es funktioniert :) –

+1

@JulianaRivera: Wenn Sie keine Kopie erstellen, fügen Sie nur eine weitere Referenz hinzu; Alle Referenzen zeigen dieselben Wörterbuchdaten an, sodass Sie dieselben Daten in der CSV-Ausgabe erhalten, die wiederholt werden. –

Verwandte Themen