2016-08-03 28 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输出中获得相同的数据,并重复。 –

相关问题