Для вашего большого текстового файла вы должны скопировать оригинал, заменить символы и написать новый файл с обновленными строками.Вы должны читать только кусок за раз, а не весь файл.(Хотя на современном компьютере вы могли бы просто отбросить все 10 МБ за один раз.)
Простой способ сделать это - использовать объект файла в качестве итератора;это возвращает по одной строке из файла за раз.
import re
pat = re.compile(ur'a([rmnu])') # pre-compile regex pattern for speed
f = open("corrected_file.txt", "wb")
for line in open("big_file_10mb.txt", "rb"):
line = pat.sub(ur'ā\1', line)
f.write(line)
f.close()
Если вы хотите вылить весь файл за один раз, вы можете использовать функцию метода .read()
:
f = open("big_file_10mb.txt", "rb")
s = f.read() # read entire file contents
f.close()
s = pat.sub(ur'ā\1', s) # replace over entire file contents
f = open("corrected_file.txt", "wb")
f.write(s) # write entire file contents
f.close(s)
Не делайте так, если у вас нет веских причин.Линейно-ориентированная версия проста для понимания и работает намного лучше, когда файлы больше по сравнению с объемом памяти на вашем компьютере.
В книге Dive Into Python есть глава, объясняющая регулярные выражения:
http://diveintopython3.ep.io/regular-expressions.html
Вы хотите прочитать Юникод и заменить символы Юникода.Вам нужно будет определить исходную кодировку файла, прочитать его, преобразовать в Unicode, выполнить подстановку, а затем записать его в правильной кодировке.Или вы можете использовать специальный модуль «кодеки»;codecs.open () предоставит вам файловый объект, который автоматически преобразует вас.
Вот документ с инструкциями по Unicode для Python:
http://docs.python.org/howto/unicode.html
Итак, давайте предположим, что текстовый файл, который вы хотите прочитать, закодирован в UTF-8.Я думаю, что это будет работать для вас:
import codecs
import re
pat = re.compile(ur'a([rmnu])') # pre-compile regex pattern for speed
f = codecs.open("corrected_file.txt", mode="wb", encoding="utf-8")
for line in codecs.open("big_file_10mb.txt", mode="rb", encoding="utf-8"):
line = pat.sub(ur'ā\1', line)
f.write(line)
f.close()