コードにいくつか問題があります。
- ファイルf1をデータに読み込んでいますが、ループのためにf1を続行しています。データを読み取ったら、ファイルを閉じることができます。
- おそらく、行を分割することをお勧めします。これはいくつかの方法で行うことができます。この
readlines
方法はおそらく最も簡単です。
- ループ内で正規表現を評価する場合、反復ごとに再コンパイルする必要があるため、非常に遅くなる可能性があります。代わりに、事前に正規表現をコンパイルして、代わりに使用することができます。
- では、実際にラインが必要なときに、ソースとして
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()
与えられたnames.xml
<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は次のようになります。
<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>