Разбить файл txt на части по поиску
в общем, задача довольно таки не стандартная. Имеется файл, такого вида:
======================================== SAMPLE 1 ========================================
Большой текст...
======================================== SAMPLE 2 ========================================
Большой текст
Ну и так далее, кол-во может быть не ограничено.
Суть в том, что бы знаки = были как разделители и всё, что содержится в sample 1 попадало в первый файл, всё, что в sample 2 во второй и тд.
В конце нужно иметь папку, в которой отдельно хранятся файлы txt с информацией.
Т.к. готового решения нет, склоняюсь к python, но я его практически не знаю, подскажите?
Ответы (2 шт):
# открываем и читаем общий большой файл,
# который должен лежать рядом с нашим py-файлом (с этим скриптом)
bigfile = open('mybigfile.txt', 'r')
lines = bigfile.readlines()
# данный алгоритм пропустит первые строки файла,
# если файл не начинается с разделителей
file = None
# Индекс очередного файла
file_index = 1
for line in lines:
# Если строка начинается со знаков равно (допустим пяти),
# то это повод завести себе новый файл
if line.strip().startwith('====='):
# Если уже был открыт предыдущий файл, то закрыть его
if file:
file.close()
# создаем следующий файл
file = open('myfile_{}.txt'.format(file_index), 'w')
# Обновляем нумератор файлов
file_index += 1
# Если файл создан, то пишем в него
if file:
file.writelines(L)
# Если имеется какой-либо созданный файл, то закрыть его
if file:
file.close()
Код:
from pathlib import Path
import re
# Регулярка для поиска строки с названием файла
pattern_file_name = re.compile('={40} (.+?) ={40}')
# Создание папки 'samples'
DIR = Path(__file__).resolve().parent / 'samples'
DIR.mkdir(exist_ok=True)
with open('sample.txt', encoding='utf-8') as f:
file_name = ''
file_obj = None
is_file_header = True
# Перебор строк файла
for line in f:
# Проверка наличия заголовка в файле
match = pattern_file_name.search(line)
if match:
if file_obj:
file_obj.close()
# Открытие нового файла
file_name = DIR / (match.group(1) + '.txt')
file_obj = open(file_name, 'w', encoding='utf-8')
is_file_header = True
continue
if not file_name:
continue
# Запись строки в файл
if is_file_header and len(line) > 50:
file_obj.write(line[:50] + '\n' + line[50:])
is_file_header = False
else:
file_obj.write(line)
if file_obj:
file_obj.close()
Создал файл sample.txt:
======================================== SAMPLE 1 ========================================
Большой текст...
======================================== SAMPLE 2 ========================================
Большой текст
Результатом будут файлы:
samples/
SAMPLE 1.txt
SAMPLE 2.txt
UPD.
Добавлена доработка, которая, при записи первой строки в файл, проверяет, что ее длина не больше 50 символов и в случае превышения, обрезает строку и переносит оставшуюся часть на следующую строку