web-dev-qa-db-ja.com

多くのxmlファイルの<values>データを置き換えます

たとえば、特定の構造を持つxmlファイルがたくさんあります。

<Class="Object">
    <Speed>25</Name>
    <Price>3</Price>

特定のフィールドの値を置き換えたい。手動で行うことはできますが、時間がかかります。

例:すべてのファイルでSpeedを100に、Priceを50に設定する必要があります。

私が今していることは、各ファイルを開き、Speedを検索してから、手動で50と入力することです。時間がかかるので、Notepad ++などのソフトウェアで自動で行う方法があるか知りたいです。

前もって感謝します!

1
Mike

スクリプトの再帰バージョンは次のとおりです。指定されたディレクトリとそのすべてのサブディレクトリ内のファイルの値を変更します。

import os
import re
my_dir = 'C:\\temp2\\my_folder\\'
replace_what = '(?<=<Speed>)(\d+)(?=<)'
replace_with = '100'
# loop through all files in directory recursively
for root, directories, filenames in os.walk(my_dir):
    for filename in filenames:
        if os.path.isfile(os.path.join(root,filename)):
            file = open(os.path.join(root,filename), 'r+')
            new_file_content=''
            for line in file:
                p = re.compile(replace_what)
                new_file_content += p.sub(replace_with, line)
            file.seek(0)
            file.truncate()
            file.write(new_file_content)
            file.close()
1
wlod

あなたの例にはタイプミスがあり、<Speed>25</Speed>

  • Ctrl+F
  • 何を見つける:(?<=<Speed>)\d+(?=</Speed>)
  • と置換する: 100
  • ラップアラウンドをチェックしてください
  • 正規表現を確認してください
  • Replace all

説明:

(?<=<Speed>)    : lookbehind, zero-length assertion to make sure we have "<Speed>" before current position
\d+             : 1 or more digits
(?=</Speed>)    : lookahead, zero-length assertion to make sure we have "</Speed>" after current position

交換:

100 : the new speed value

価格についても同じようにします。上記の手順でSpeedPriceに置き換えます。

1
Toto

この目的のためにPython3.xを試すことができます。 Pythonは多くのプラットフォームで利用できるため、使用しました。このスクリプトをWindowsとUbuntuでテストしました。問題は発生していません。このスニペットは、Speed値のみを変更します。ただし、変数replace_whatを自由に変更して、必要に応じて変更できるようにしてください。

import os
import re
my_dir = 'C:\\temp2\\my_folder\\'
replace_what = '(?<=<Speed>)(\d+)(?=<)'
replace_with = '100'
# loop through all files in directory
for fn in os.listdir(my_dir):
    #print(fn)
    pathfn = os.path.join(my_dir,fn)
    if os.path.isfile(pathfn):
        file = open(pathfn, 'r+')
        new_file_content=''
        for line in file:
            p = re.compile(replace_what)
            new_file_content += p.sub(replace_with, line)
        file.seek(0)
        file.truncate()
        file.write(new_file_content)
        file.close()
0
wlod