Project

General

Profile

Автоматический импорт новостей с использованием python-скриптов » interfax.py

Sergey Kolyshkin, 21/06/2022 17:46

 
#! /usr/bin/env python3
# пример препроцессинга для Interfax
import sys
import os
import json

skip_empty = True # пропускать пустые строки
skip_first = 2 # пропустить первые строки
skip_last = 2 # пропустить последние строки
comment_count = 3 # сколько строк в комментарии

def main():
name = '' # сюда будем писать название
comment = '' # сюда будем писать комментарии
body = '' # сюда будем писать тело
hasBOM = False # присутствует ли заголовок utf-8 в файле

#fin = open(sys.argv[1] if len(sys.argv) > 1 else sys.stdin, "rb")
# получим имя файла из командной строки
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 байта
#print(message)

# создаем список строк из message, для этого
# декодируем из utf-8
# заменяем символы \r\n (возврат каретки и переход на новуб строку) на \n
# разделяем message на строки
lines = message.decode(encoding="utf-8").replace("\r\n", "\n").split("\n")

# test ouput
#print(lines)
comment_written = 0 # счетчик строк комментария
# для всех строк в диапазоне от skip_first до (len(lines) - skip_last)
for i in range(skip_first, len(lines) - skip_last - skip_first):
#print("line[" + str(i) +"]="+lines[i] + '\n')
# пропускаем пустые строки
if len(lines[i]) < 1 and skip_empty: continue
# сохраняем name (первая непустая строка)
if len(name) < 1:
name = lines[i]
continue

# сохраняем/дополняем comment ( comment_count непустых строк )
if comment_written < comment_count:
comment += lines[i] + '\n'
comment_written += 1

# сохраняем/дополняем в body все строки, кроме той, что 'name'
body += lines[i] + '\n'
# удалить последние символы \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('\/', '\\/')

# test ouput
#print('{name:' + name + ', comment: ' + comment + ', body: ' + body + ' }')
# открываем тот же самый файл для записи в бинарном формате
# будем записывать в 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'"comment":"' + comment.encode(encoding="utf-8") + b'",')
# записываем текст body
fout.write(b'"body":"' + body.encode(encoding="utf-8") + b'"}')
# закрываем файл
fout.close()

if __name__ == '__main__':
main()
(3-3/5)
Add picture from clipboard (Maximum size: 742 MB)