Реализации HashSet, конечно, намного быстрее - меньше накладных расходов, потому что нет упорядочения. Хороший анализ различных реализаций Set в Java предоставлен по адресу http://java.sun.com/docs/books/tutorial/collections/implementations/set.html .
Обсуждение там также указывает на интересный подход «среднего уровня» к вопросу «Дерево против хеша». Java предоставляет LinkedHashSet, который представляет собой HashSet с проходящим через него «ориентированным на вставку» связанным списком, то есть последний элемент в связанном списке также последний раз вставляется в Hash. Это позволяет вам избежать беспорядка неупорядоченного хэша без увеличения стоимости TreeSet.
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")
Чтобы избежать повторного использования в каталогах .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")