#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")