Ответ 1
Используйте модуль fileinput
, если вы хотите изменить исходный файл:
import re
import fileinput
for line in fileinput.input(r'C:\temp\Scripts\remove.txt', inplace = True):
if not re.search(r'\byahoo\b',line):
print line,
Я пытаюсь удалить все строки, где совпадает мое регулярное выражение (регулярное выражение просто ищет любую строку, в которой есть yahoo). Каждое совпадение находится на собственной строке, поэтому нет необходимости в многострочном варианте.
Это то, что у меня есть до сих пор...
import re
inputfile = open('C:\\temp\\Scripts\\remove.txt','w',encoding="utf8")
inputfile.write(re.sub("\[(.*?)yahoo(.*?)\n","",inputfile))
inputfile.close()
Я получаю следующую ошибку:
Traceback (последний последний вызов): строка 170, в подпункте return _compile (pattern, flags).sub(repl, string, count) TypeError: ожидаемая строка или буфер
Используйте модуль fileinput
, если вы хотите изменить исходный файл:
import re
import fileinput
for line in fileinput.input(r'C:\temp\Scripts\remove.txt', inplace = True):
if not re.search(r'\byahoo\b',line):
print line,
Здесь вариант Python 3 @Ashwini Chaudhary answer:
#!/usr/bin/env python3
import fileinput
import re
import sys
def main():
pattern, filename = sys.argv[1:] # get pattern, filename from command-line
matched = re.compile(pattern).search
with fileinput.FileInput(filename, inplace=1, backup='.bak') as file:
for line in file:
if not matched(line): # save lines that do not match
print(line, end='') # this goes to filename due to inplace=1
main()
Он принимает locale.getpreferredencoding(False) == 'utf-8'
, иначе он может сломаться на символах, отличных от ascii.
Чтобы он работал независимо от текущей локали или для входных файлов с другой кодировкой:
#!/usr/bin/env python3
import os
import re
import sys
from tempfile import NamedTemporaryFile
def main():
encoding = 'utf-8'
pattern, filename = sys.argv[1:]
matched = re.compile(pattern).search
with open(filename, encoding=encoding) as input_file:
with NamedTemporaryFile(mode='w', encoding=encoding,
dir=os.path.dirname(filename)) as outfile:
for line in input_file:
if not matched(line):
print(line, end='', file=outfile)
outfile.delete = False # don't delete it on closing
os.replace(outfile.name, input_file.name)
main()
Вы должны прочитать файл, попробуйте что-то вроде:
import re
inputfile = open('C:\\temp\\Scripts\\remove.txt','w',encoding="utf8")
inputfile.write(re.sub("\[(.*?)yahoo(.*?)\n","",inputfile.read()))
file.close()
outputfile.close()