たとえば、特定の構造を持つxmlファイルがたくさんあります。
<Class="Object">
<Speed>25</Name>
<Price>3</Price>
特定のフィールドの値を置き換えたい。手動で行うことはできますが、時間がかかります。
例:すべてのファイルでSpeedを100に、Priceを50に設定する必要があります。
私が今していることは、各ファイルを開き、Speedを検索してから、手動で50と入力することです。時間がかかるので、Notepad ++などのソフトウェアで自動で行う方法があるか知りたいです。
前もって感謝します!
スクリプトの再帰バージョンは次のとおりです。指定されたディレクトリとそのすべてのサブディレクトリ内のファイルの値を変更します。
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()
あなたの例にはタイプミスがあり、<Speed>25</Speed>
(?<=<Speed>)\d+(?=</Speed>)
100
説明:
(?<=<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
価格についても同じようにします。上記の手順でSpeed
をPrice
に置き換えます。
この目的のために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()