Я хотел бы учиться использовать Python в качестве замены сценариев командной строки. Я провел некоторое время с Python в прошлом, но это было некоторое время. Это, кажется, в рамках него.
У меня есть несколько файлов в папке, что я хочу сделать поиск-и-замену на во всех них. Я хотел бы сделать это со сценарием Python.
Например, ищите и замените все экземпляры"foo
"с"foobar
".
это альтернатива, поскольку вам представлены различные решения Python. Самая полезная утилита (на мой взгляд) в Unix / Windows - это команда GNU find и инструменты замены, такие как sed / awk. для поиска файлов (рекурсивно) и выполнения замены можно использовать простую команду, подобную этой (синтаксис берется из памяти и не проверяется). здесь говорится найти все текстовые файлы и изменить в их содержимом слово «старый» на «новый», в то же время используйте sed
для резервного копирования исходных файлов ...
$ find /path -type f -iname "*.txt" -exec sed -i.bak 's/old/new/g' "{}" +;
Добро пожаловать в StackOverflow. Поскольку вы хотите узнать себя (+1), я дам вам несколько советов.
Просмотрите os.walk ()
, чтобы получить все файлы.
Затем перебирайте каждую строку в файлах (здесь пригодится для строки в текущем файле:
).
Теперь вам нужно знать, хотите ли вы «глупую» замену (найти / заменить каждый foo
, даже если он находится в середине слова (скажем, foobar
- хотите, foofoobar
в результате?) Или умная замена.
Для первого посмотрите на str.replace ()
, для последнего посмотрите на re.sub ()
и выясните, что означает r '\ bfoo \ b'
.
Я работал над этим, и это, кажется, работает, но любые ошибки, на которые можно указать, были бы потрясающими.
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")
расширением этого будет переход к папкам внутри папок.
Обычно для этого я использую старый добрый 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)
.