2016-08-03 64 views
0

我想弄清楚爲什麼我的代碼行爲與正常執行不同。我已經看到了這一點,但它不是我的情況:調試行爲不同於python中的正常執行

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

python2.7 using debug behave different then without debug

我解析XML文檔的數據幀,這樣我就可以轉換成CSV或Excel文件。正常執行時,它只解析「LOCALIDADE」節點的最後一個「CPE」。

這是我的XML文件的塊:

<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> 

此代碼的工作對我來說,當我調試它:

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']) 

不過這是結果,當我用正常執行運行:

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 

我不知道當我將字典添加到列表中,或者某種衝突wh時它可能會成爲問題它試圖轉換爲CSV(我不認爲是這種情況)。

但正如我所說的那樣,我有我想要的結果,當我調試,所以我看不出有什麼問題。

回答

2

您正在反覆將相同的字典添加到列表中。 Python容器存儲引用,而不是副本,所以您對該字典所做的任何更改都將通過所有這些引用可見。

是的,在下一次迭代中修改它之前打印該字典將不會顯示您在下一次迭代中所做的更改。畢竟,你並沒有打印你添加的字典,所以你沒有看到那些引用反映了這些變化。

添加字典,而不是一個副本:

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

您可以輕鬆地再現交互式會話您的問題:

>>> 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

旁白:性能問題:很多'if'可以開啓進入'elif',速度可能會好很多。 –

+0

因此,每次我想將一個字典追加到列表中,我需要追加一個副本?不是具有不同價值的字典,而是一個副本?謝謝你的幫助!它的作品:) –

+1

@JulianaRivera:如果你不創建一個副本,你所做的只是添加另一個參考;所有引用都顯示相同的字典數據,因此您將在CSV輸出中獲得相同的數據,並重復。 –

相關問題