Поиск-и-замена через все файлы в папке через Python?

Я хотел бы учиться использовать Python в качестве замены сценариев командной строки. Я провел некоторое время с Python в прошлом, но это было некоторое время. Это, кажется, в рамках него.

У меня есть несколько файлов в папке, что я хочу сделать поиск-и-замену на во всех них. Я хотел бы сделать это со сценарием Python.

Например, ищите и замените все экземпляры"foo"с"foobar".

5
задан fruit 24 June 2010 в 13:42
поделиться

4 ответа

это альтернатива, поскольку вам представлены различные решения Python. Самая полезная утилита (на мой взгляд) в Unix / Windows - это команда GNU find и инструменты замены, такие как sed / awk. для поиска файлов (рекурсивно) и выполнения замены можно использовать простую команду, подобную этой (синтаксис берется из памяти и не проверяется). здесь говорится найти все текстовые файлы и изменить в их содержимом слово «старый» на «новый», в то же время используйте sed для резервного копирования исходных файлов ...

$ find /path -type f -iname "*.txt" -exec sed -i.bak 's/old/new/g' "{}" +;
0
ответ дан 14 December 2019 в 04:30
поделиться

Добро пожаловать в StackOverflow. Поскольку вы хотите узнать себя (+1), я дам вам несколько советов.

Просмотрите os.walk () , чтобы получить все файлы.

Затем перебирайте каждую строку в файлах (здесь пригодится для строки в текущем файле: ).

Теперь вам нужно знать, хотите ли вы «глупую» замену (найти / заменить каждый foo , даже если он находится в середине слова (скажем, foobar - хотите, foofoobar в результате?) Или умная замена.

Для первого посмотрите на str.replace () , для последнего посмотрите на re.sub () и выясните, что означает r '\ bfoo \ b' .

5
ответ дан 14 December 2019 в 04:30
поделиться

Я работал над этим, и это, кажется, работает, но любые ошибки, на которые можно указать, были бы потрясающими.

import fileinput, sys, os

def replaceAll(file, findexp, replaceexp):
    for line in fileinput.input(file, inplace=1):
        if findexp in line:
            line = line.replace(findexp, replaceexp)
        sys.stdout.write(line)

if __name__ == '__main__':
    files = os.listdir("c:/testing/")
    for file in files:
        newfile = os.path.join("C:/testing/", file)
        replaceAll(newfile, "black", "white")

расширением этого будет переход к папкам внутри папок.

1
ответ дан 14 December 2019 в 04:30
поделиться

Обычно для этого я использую старый добрый perl -pi -e 's/foo/foobar/', но если вы хотите Python:

import os
import re
_replace_re = re.compile("foo")
for dirpath, dirnames, filenames in os.walk("directory/"):
    for file in filenames:
        file = os.path.join(dirpath, file)
        tempfile = file + ".temp"
        with open(tempfile, "w") as target:
            with open(file) as source:
                for line in source:
                    line = _replace_re.sub("foobar", line)
                    target.write(line)
        os.rename(tempfile, file)

И если вы на Windows, вам нужно добавить os.remove(file) перед os.rename(tempfile, file).

2
ответ дан 14 December 2019 в 04:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: