Есть ли поиск и замена по всем файлам в папке через Python? - PullRequest
5 голосов
/ 24 июня 2010

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

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

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

Ответы [ 4 ]

5 голосов
/ 24 июня 2010

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

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

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

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

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

2 голосов
/ 24 июня 2010

Обычно я бы выбрал для этого старый 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).

1 голос
/ 24 июня 2010

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

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

расширение этого было бы для перемещения в папки внутри папок.

0 голосов
/ 24 июня 2010

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

$ find /path -type f -iname "*.txt" -exec sed -i.bak 's/old/new/g' "{}" +;
...