2012-09-05 58 views
2

之間的字符串,這是我下面的Python腳本,我嘗試使用sub()利用可變連續數n然後全部更換<StartNum></StartNum>之間的值,將結果寫入到一個新的文本文件。 任何人都可以指出錯誤?蟒蛇調試:更換兩個未知子

import re 
f1 = open('name.xml', 'r') 
f2 = open('result.txt', 'w') 
data=f1.read() 
n=5000 
for line in f1: 
     f2.write(re.sub('<StartNum>(.*)</StartNum>', r'<StartNum>%s</StartNum>' % str(n), data)) 
     if "<StartNum>" in line: 
      n=n+1 
f1.close() 
f2.close() 
+1

一旦你調用'read'並獲得'data' ......你是在結束'f1' ...你可以使用'f1.seek(0)'返回開頭 –

+0

你的輸入是什麼樣的,文件name.xml?你想要的輸出是什麼樣的? – sberry

回答

1

您的代碼存在一些問題。

  1. 您正在將文件f1讀入數據中,但您仍在繼續使用f1作爲循環。讀完數據後,您可以關閉文件。
  2. 你可能想分割線。您可以通過多種方式來做到這一點。 readlines方法可能是最直接的方法。
  3. 當您在循環中計算正則表達式時,它可能會非常緩慢,因爲它必須在每次迭代時重新編譯。相反,您可以提前編譯正則表達式並使用它。
  4. 在您的re.sub中,您使用的是data作爲源,而您實際上需要該線。

還有其他的事情可以改善代碼,但上面列出的是非常必要的。

我猜這可能會做你想做的。

import re 
f1 = open('name.xml', 'r') 
f2 = open('result.txt', 'w') 
data = f1.readlines() 
f1.close() 
n = 5000 
rex = re.compile('<StartNum>(.*)</StartNum>') 
for line in data: 
    f2.write(rex.sub(r'<StartNum>%s</StartNum>' % str(n), line)) 
    if "<StartNum>" in line: 
     n += 1 
f2.close() 

鑑於

<root> 
    <StartNum>1</StartNum> 
    <StartNum>5</StartNum> 
    <StartNum>8</StartNum> 
    <StartNum>9</StartNum> 
    <StartNum>13</StartNum> 
    <StartNum>33</StartNum> 
    <foo> 
     <bar baz="5" /> 
    </foo> 
</root> 

的Result.txt的names.xml將是:

<root> 
    <StartNum>5000</StartNum> 
    <StartNum>5001</StartNum> 
    <StartNum>5002</StartNum> 
    <StartNum>5003</StartNum> 
    <StartNum>5004</StartNum> 
    <StartNum>5005</StartNum> 
    <foo> 
     <bar baz="5" /> 
    </foo> 
</root> 
+0

在旁邊注意你應該使用xml或html解析器而不是正則表達式來處理這些事情...(儘管在這個特定的例子中正則表達式應該正常工作) –

+0

哦!是的〜我知道錯誤。謝謝!學習新事物! – TJLD22