У меня много XML-файлов с определенной структурой, например

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

Я хочу заменить значения из определенных полей. Я могу сделать это вручную, но это займет много времени.

Например: мне нужно установить Speed на 100 и Price на 50 во всех файлах.

Что я делаю сейчас, я открываю каждый файл, ищу скорость, а затем вручную набираю 50 там и так далее. Это занимает много времени, поэтому я хотел бы знать, есть ли способ сделать это автоматически через Notepad++ или другое программное обеспечение.

Заранее спасибо!

3 ответа3

0

Вот рекурсивная версия скрипта. Он изменяет значения в файлах в данном каталоге и во всех его подкаталогах.

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

Вы можете попробовать Python3.x для этой цели. Я использовал Python, так как он доступен на многих платформах. Я тестировал этот скрипт на Windows и Ubuntu. Я не наблюдал никаких проблем. Этот фрагмент изменяет только значения скорости, но не стесняйтесь изменять переменную 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

Я предполагаю, что в вашем примере есть опечатка, и у вас есть <Speed>25</Speed>

  • Ctrl+F
  • Найти что: (?<=<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 в приведенных выше инструкциях.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .