|
#! /usr/bin/env python3
|
|
# пример препроцессинга для TASS
|
|
#
|
|
# '\01'TAS001 3 ИНФ 0273 ТАСС 10A00 ИНОА РУ
|
|
# МИД-НАТО
|
|
#'\02'УКРАИНА: МИД-НАТО-ЧЛЕНСТВО-1
|
|
# '\14' Отказ Украины от вступления в НАТО позволил бы европейцам вздохнуть с
|
|
#облегчением - Лавров
|
|
# '\14' /Обновлено, добавлена информация после третьего абзаца/
|
|
# '\14'
|
|
# '\14' МОСКВА, 15 февраля. /ТАСС/. Отказ Киева от членства в НАТО позволил бы
|
|
#многим европейским странам вздохнуть с облегчением. Об этом заявил во вторник
|
|
#.......
|
|
#для оправдания таких заявлений и предупредил, что попытки силового решения
|
|
#кризиса на юго-востоке Украины будут иметь самые серьезные последствия.
|
|
#--0--**
|
|
# '\03'151450 ФЕВ 22'\04'
|
|
#
|
|
#
|
|
|
|
import sys, os
|
|
|
|
skip_empty = True # пропускать пустые строки
|
|
skip_first = 2 # пропустить первые строки
|
|
skip_last = 1 # пропустить последние строки
|
|
|
|
def main():
|
|
name = '' # сюда будем писать название
|
|
comment = '' # сюда будем писать комментарии
|
|
body = '' # сюда будем писать тело
|
|
hasBOM = False # присутствует ли заголовок utf-8 в файле
|
|
|
|
# получим имя файла из командной строки
|
|
filename = sys.argv[1] if len(sys.argv) > 1 else None
|
|
# если имя пустое - выходим
|
|
if filename is None: return
|
|
#print("filename=" + filename + "\n")
|
|
|
|
# открываем файл для чтения как бинарный (НЕ Текстовый)
|
|
# (это всегда файл в кодировке utf-8, может содержать заголовок BOM_UTF8)
|
|
with open(filename, "rb") as fin:
|
|
# читаем данные, закрываем файл
|
|
message = fin.read(); fin.close()
|
|
|
|
# проверяем, есть ли заголок BOM_UTF8 (первые 3 байта)
|
|
if message.startswith(b'\xef\xbb\xbf'):
|
|
hasBOM = True # сохраняем флаг наличия заголовка
|
|
message = message[3:] # пропускаем первые 3 байта
|
|
|
|
# создаем список строк из message, для этого
|
|
# декодируем из utf-8
|
|
# заменяем символы \r\n (возврат каретки и переход на новуб строку) на \n
|
|
# разделяем message на строки
|
|
lines = message.decode(encoding="utf-8").replace("\r\n", "\n").split("\n")
|
|
#print(lines)
|
|
|
|
body_start = False # флаг конца comment / начала сохранения body
|
|
# для всех строк в диапазоне от skip_first до (len(lines) - skip_last - skip_first)
|
|
for i in range(skip_first, len(lines) - skip_last - skip_first):
|
|
|
|
line = lines[i]
|
|
|
|
# сохраняем name ( строка начинается с символа '\02' )
|
|
if line.startswith('\x02') :
|
|
print("begin name")
|
|
# убираем пробелы в начале и конце строки и символ '\02'
|
|
name = line[1:].strip()
|
|
print(name)
|
|
continue
|
|
|
|
if line.startswith('\x14') :
|
|
print("begin paragraph")
|
|
line = line[1:]
|
|
if len(line.strip()) < 1:
|
|
body_start = True
|
|
print("begin body")
|
|
continue
|
|
|
|
# пропускаем пустые строки
|
|
if len(line.strip()) < 1 and skip_empty: continue
|
|
|
|
# сохраняем/добавляем comment (все строки после названия до пустого параграфа)
|
|
# т.е. пока body_start не станет True
|
|
if body_start == False:
|
|
# удаляем пробелы
|
|
comment += line.strip() + '\n'
|
|
continue
|
|
|
|
# сохраняем/дополняем в body все строки, ищем --0-- для конца сообщения
|
|
end = line.find('--0--')
|
|
if end < 0:
|
|
body += line + '\n'
|
|
else:
|
|
body += line[0: end]
|
|
break
|
|
|
|
# удалить последние символы \n из comment и body
|
|
comment = comment.rstrip('\n');
|
|
body = body.rstrip('\n');
|
|
|
|
# по требованию к JSON формату преобразовываем управляющие символы
|
|
# \n to \\n, \ на \\, ' на \', " на \" и т.д.
|
|
name = name.replace('\\', '\\\\').replace('\n', '\\n').replace('\'', "\\'").replace('\"', '\\"').replace('\t', '\\t').replace('\/', '\\/')
|
|
comment = comment.replace('\\', '\\\\').replace('\n', '\\n').replace('\'', "\\'").replace('\"', '\\"').replace('\t', '\\t').replace('\/', '\\/')
|
|
body = body.replace('\\', '\\\\').replace('\n', '\\n').replace('\'', "\\'").replace('\"', '\\"').replace('\t', '\\t').replace('\/', '\\/')
|
|
|
|
# открываем тот же самый файл для записи в бинарном формате
|
|
# будем записывать в JSON формате
|
|
fout = open(filename, "wb")
|
|
# если флаг hasBOM установлен -> записываем заголовок
|
|
if hasBOM == True : fout.write(b'\xef\xbb\xbf')
|
|
# записываем name, закодировав в utf-8
|
|
fout.write(b'{"name":"' + name.encode(encoding="utf-8") + b'",')
|
|
# записываем comment (или subject)
|
|
fout.write(b'"subject":"' + comment.encode(encoding="utf-8") + b'",')
|
|
# записываем текст body
|
|
fout.write(b'"body":"' + body.encode(encoding="utf-8") + b'"}')
|
|
# закрываем файл
|
|
fout.close()
|
|
|
|
if __name__ == '__main__':
|
|
main()
|