linelist
- это list
, вы конвертируете это в строку, в результате чего re.sub
удаляет все до последнего >\n]
. Когда вы запускаете str
в списке, вы получаете, например:
In [1]: str([1, 2])
Out[1]: '[1, 2]'
Это основная проблема. Вам нужно перебрать список и выполнить операции с каждой строкой отдельно и сохранить измененную строку.
Но было бы лучше, чем сделать spiltlines
на объекте файла, чтобы получить все строки наединый список;так как ваш файл большой, это потребует огромных затрат памяти.
Также я бы предложил вам использовать отдельные файлы для чтения и записи, когда вы выполняете операции над каждой строкой файла, а затем записываете обратно втот же файл. Если вы должны использовать один и тот же файл, я бы использовал отдельные файлы, а затем заменил (shutil.move
) считывающий файл на записывающий, как только операции будут завершены.
Итак, в целом, лучшим подходом будет итерациянад файловым объектом (так как это итератор) и выполните операцию:
with open('input_file') as in_file, open('output_file', 'w') as out_file:
for line in in_file:
modified_line = re.sub(r'^.*(?=>)', ' ', line)
out_file.write(modified_line)
open
- это менеджер контекста, поэтому вы можете использовать with
statememnt для него, он имеет дополнительные преимущества при вызове close
для файлового объекта, поэтому вам не нужно закрывать их вручную.
Если ваш шаблон точно такой же, как показано в примере, вы можете использовать str.replace
, нет необходимости в Regex:
modified_line = line.replace('test ', ' ')