Python - способ рекурсивного поиска и замены строки в текстовых файлах

Реализации HashSet, конечно, намного быстрее - меньше накладных расходов, потому что нет упорядочения. Хороший анализ различных реализаций Set в Java предоставлен по адресу http://java.sun.com/docs/books/tutorial/collections/implementations/set.html .

Обсуждение там также указывает на интересный подход «среднего уровня» к вопросу «Дерево против хеша». Java предоставляет LinkedHashSet, который представляет собой HashSet с проходящим через него «ориентированным на вставку» связанным списком, то есть последний элемент в связанном списке также последний раз вставляется в Hash. Это позволяет вам избежать беспорядка неупорядоченного хэша без увеличения стоимости TreeSet.

24
задан Martin 17 November 2010 в 15:50
поделиться

2 ответа

os.walk это здорово. Тем не менее, похоже, что вам нужно тип файлов файлов (что я хотел бы предложить, если вы собираетесь пройтись по некоторому каталогу). Для этого нужно добавить import fnmatch.

import os, fnmatch
def findReplace(directory, find, replace, filePattern):
    for path, dirs, files in os.walk(os.path.abspath(directory)):
        for filename in fnmatch.filter(files, filePattern):
            filepath = os.path.join(path, filename)
            with open(filepath) as f:
                s = f.read()
            s = s.replace(find, replace)
            with open(filepath, "w") as f:
                f.write(s)

Это позволяет вам сделать что-то вроде:

findReplace("some_dir", "find this", "replace with this", "*.txt")
51
ответ дан 28 November 2019 в 22:14
поделиться

Чтобы избежать повторного использования в каталогах .svn, os.walk() позволяет изменять список dirs на месте. Чтобы упростить замену текста в файле без необходимости считывания всего файла в памяти, вы можете использовать модуль fileinput . А чтобы отфильтровать имена файлов, используя шаблон файла, вы можете использовать модуль fnmatch как , предложенный @David Sulpy :

#!/usr/bin/env python
from __future__ import print_function
import fnmatch
import os
from fileinput import FileInput

def find_replace(topdir, file_pattern, text, replacement):
    for dirpath, dirs, files in os.walk(topdir, topdown=True):
        dirs[:] = [d for d in dirs if d != '.svn'] # skip .svn dirs
        files = [os.path.join(dirpath, filename)
                 for filename in fnmatch.filter(files, file_pattern)]
        for line in FileInput(files, inplace=True):
            print(line.replace(text, replacement), end='')

find_replace(r"C:\test", "*.php", '{$replace}', "multiline\nreplacement")
6
ответ дан 28 November 2019 в 22:14
поделиться
Другие вопросы по тегам:

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