re.sub заменяет текст в моем файле пробелами. Не уверен, почему

#python-3.x

#python-3.x

Вопрос:

Недавно попробовал некоторые изменения, чтобы посмотреть, смогу ли мой I отследить проблему и посмотреть, была ли вообще сопоставлена моя строка регулярного выражения. Не повезло с совпадением, однако я не уверен, что все правильно. Верхний код является самым последним.

 import os
import re

progNumber = 1
text_to_replace = re.compile("^BOWL_PROG6_14G$")
replace_string = 'Bowl_Prog1'


def sub_ftext(file_path='W:\BOWL PROGRAMS 14G'):
    old_text = text_to_replace
    count = progNumber
    for d_name, dirs, files in os.walk(file_path):
        for f_name in files:
            f_path = os.path.join(d_name, f_name)
            if f_name.endswith('.ls'):
                with open(f_path) as txt:
                    s = txt.read()
                    for line in txt:
                        if text_to_replace.search(line):
                        # Substitute the contents
                            new_text = replace_string   str(count)
                            s = re.sub(old_text, new_text, s)
                            # Write it back into the file
                            with open(f_path, "w") as txt:
                                txt.write(s)
                            count  = 1
                            print(s)
                            print(old_text)

     # for text in text_to_replace:
     #        print(text)
        # dirnames = set(os.path.join(d_name, d) for d in dirs)
        #     # Traverse subfolders
        # if dirnames.startwith('BOWL-'):
        #     for subs in dirnames:


sub_ftext()
  

`Программа находит строку, которую я ищу, но заменяет ее ничем в каждом файле.

 import os
import re


os.chdir('W:\BOWL PROGRAMS 14G')
progNumber = 1
text_to_replace = re.compile("^BOWL 14G$")
replacement = ("Bowl_Prog_14G"   str(progNumber))


for d_name, dirs, files in os.walk("."):
    for f_name in files:
        f_path = os.path.join(d_name, f_name)
        if f_name.endswith('.ls'):
            with open(f_path) as txt:
                for line in txt:
                    s = txt.read()
            #s = s.replace(text_to_replace, replacement)
            with open(f_path, "w") as txt:
                txt.write(s)
                print(re.sub(text_to_replace, replacement, line))
                progNumber  = 1
  

Комментарии:

1. Я пробовал писать заменяющую переменную как с помощью, так и без ()

2. Собираетесь ли вы заменить содержимое и записать его обратно в файл? Прямо сейчас print(re.sub(text_to_replace, replacement, line)) печатается только замененное содержимое, но вы все еще записываете исходное содержимое обратно в файл с txt.write(s)

3. Да, я намерен заменить содержимое и записать новое содержимое обратно в файл.

Ответ №1:

Просто несколько незначительных изменений в вашем существующем коде. На самом деле вам не нужно заменять содержимое построчно, поэтому я удалил эту строку.

 import os
import re

progNumber = 1
text_to_replace = re.compile("^BOWL_14G$")

def sub_ftext(file_path, text_to_replace, progNumber):
    for d_name, dirs, files in os.walk(file_path):
        for f_name in files:
            replacement = ("Bowl_Prog_14G"   str(progNumber))
            f_path = os.path.join(d_name, f_name)

            if f_name.endswith('.ls'):
                with open(f_path) as txt:
                    sl = txt.read()
                # Substitute the contents
                sl = re.sub(text_to_replace, replacement, sl)
                # Write it back into the file
                with open(f_path, "w") as txt:
                    txt.write(sl)

                progNumber  = 1

    # Traverse subfolders
    dirnames = set(os.path.join(d_name, d) for d in dirs)
    if dirnames:
        for subs in dirnames:
            sub_ftext(subs, text_to_replace, progNumber)

if __name__ == '__main__':
    sub_ftext(r'C:DocumentsTestFolder', text_to_replace, progNumber)
  

Редактировать: если вам также нужно просмотреть вложенные папки, один из способов сделать это — обернуть приведенные выше строки в функцию, которую затем можно вызвать рекурсивно. Вероятно, есть и другие способы сделать это

Комментарии:

1. Это немного сбивает меня с толку. Файл .ls, который я пытаюсь изменить, сообщает, что он был изменен в notepad, но ничего не меняется.

2. на самом деле это один корневой каталог. В этом корневом каталоге есть несколько подкаталогов, и в каждом из них есть еще 2 подкаталога, и в одной из этих подпапок находятся файлы .ls, к которым мне нужно получить доступ.

3. @Robotics101 обновил мой ответ, чтобы разрешить обход подкаталогов. Вам придется выполнить небольшой рефакторинг вашего кода, чтобы вызвать функцию и указать в ней путь к каталогу, который вы хотите обработать, если вы решите использовать это

4. Итак, для обновления. Я попробовал способ, который вы опубликовали, обернув код в функцию, и, похоже, он не работал, пока оставалась нижняя часть. Однако, когда я это комментирую и просто вызываю функцию, она частично работает, но удаляет всю программу. Я не помню, чтобы это было настолько сложно, когда я делал подобные вещи на C #. Но это процесс обучения, и, надеюсь, я скоро с этим разберусь. Однако я ценю помощь, которую вы мне оказали. Вы дали мне столь необходимую информацию. Как вы думаете, возможно ли, что моя проблема заключается в моем reg-выражении?

5. Также в какой-то момент он считывал весь текстовый файл целиком, но ничего не менял. Похоже, что регулярное выражение не совпало. У вас есть какие-нибудь идеи, как я мог бы протестировать строку регулярного выражения. Посмотрим, сработает ли это mabey.

Ответ №2:

 import os
import re


def sub_text(file_path):
    os.chdir(file_path)
    prog_number = 1
    text_to_replace = re.compile("BOWL_PROG[0-9]*_14G")
    for d_name, dirs, files in os.walk("."):
        for f_name in files:
            replacement=("Bowl_Prog"   str(prog_number))
            f_path = os.path.join(d_name, f_name)
            if f_name.endswith('.ls'):
                with open(f_path) as line:
                        ls = line.read()
                with open(f_path, "w") as line:
                        ls = re.sub(text_to_replace, replacement, ls)
                        line.write(ls)
                        print(line)
                        prog_number  = 1
                        print(prog_number)
                        print(replacement)


if __name__ == '__main__':
    sub_text(r"W:\BOWL PROGRAMS 14G")