2

これは以下の私の python スクリプトです。可変連続数を使用してとsub()の間のすべての値を置き換えようとします。次に、結果を新しいテキスト ファイルに書き込みます。誰かが間違いを指摘できますか?<StartNum></StartNum>n

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()
4

1 に答える 1

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

与えられた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>
于 2012-09-05T04:14:53.003 に答える