Страницы

Поиск по вопросам

суббота, 14 декабря 2019 г.

Заменить слово в файле

#python


Нужно открыть файл, найти и заменить в нем одно слово (оно встречается в файле 1
раз) и сохранить под другим названием.

На баше эта задача решается вот так:

cat /tmp/test/file | sed "s/TEST_OLD/TEST_OLD/"> /tmp/test/file_new


C Питоном не очень, представляю что проблема решается как-то примерно так:

import re
output_file = open("/tmp/test/file").readlines()
string = "TEST_OLD"
string.replace(string,"TEST_NEW")
open("/tmp/test/file_new", "w")

    


Ответы

Ответ 1



Ну в целом верно, только модуль re не нужен, также стоит либо использовать with, либо закрывать файлы file.close() после использования. Как то так в конечном итоге: with open('test1') as file_in: text = file_in.read() text = text.replace("TEST_OLD", "TEST_NEW") with open("test2", "w") as file_out: file_out.write(text) Да и readlines() возвращает список строк и это не совсем то что нам здесь нужно. Update 0: Для замены лучше использовать регулярные выражения, чтобы избежать проблем при включении слова в другие и т.д. Спасибо @ReinRaus за замечание. Обрати внимание на ответ @andy.37 Если файл объемный, то read() плохая идея, поскольку так мы загрузим все содержимое файла в память. Правильный выбор в этом случае - построчное чтение/запись.

Ответ 2



Не имеет смысл читать файл целиком и забивать память. Ну и вопрос при замене word -> WORD, менять ли что-то в слове 'sword'? def replace_in_file(file1, file2, pattern, subst, wordonly=True): with open(file1, 'r') as f1: with open(file2, 'w') as f2: for line in f1: if wordonly: # заменяем word -> WORD, но не sword -> sWORD f2.write(re.sub('\b{}\b'.format(pattern), subst, line) else: # заменяем и word -> WORD и sword -> sWORD f2.write(line.replace(pattern, subst))

Ответ 3



oldfile = open("file", "r") newfile = open("file_new", "w") for line in oldfile: s = line.replace("TEST_OLD","TEST_NEW") newfile.write(s)

Ответ 4



Чтобы выполнить аналог: sed 's/OLD/NEW/' file >file_new: from pathlib import Path Path('file_new').write_text(Path('file').read_text().replace('OLD', 'NEW')) Чтобы не заменять все подстроки, а только целые слова, можно регулярные выражения использовать: Замена в файле списка слов. Чтобы не загружать весь файл целиком в память, можно построчно замену производить. См. Как заменить строчку в .txt файле через python 3? В случае, если замена имеет ту же длину в байтах и результат вы хотите в тот же файл записать (по месту замена), можно mmap воспользоваться: from mmap import ACCESS_WRITE, mmap old, new = b'OLD', b'NEW' with open('file', 'r+b') as file, mmap(file.fileno(), 0, access=ACCESS_WRITE) as s: i = s.find(old) if i != -1: s[i:i+len(old)] = new В этом случае файл не переписывается целиком, а только нужное место обновляется.

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

Отправить комментарий