У вас есть несколько вариантов здесь.
Самое простое - просто взять существующую функцию text_org
, выделить часть "parse-a-single-line" и поместить ее в отдельную функцию.Рефакторинг, ваш код будет выглядеть так:
def parse_line(outfile, line):
tokens = line.split()
outfile.write(...)
...
def text_org():
...
with open('/home/log/radius.log', 'r') as infile:
with open('current_logs_sql_ready.txt', 'w') as outfile:
for l in infile:
parse_line(outfile, l)
Затем из вашего обработчика сокета:
log = socket.socket(socket.AF_UNIX, socket.SOCK_DGRAM)
log.bind("/home/log/socket")
with open('current_logs_sql_ready.txt', 'w') as outfile:
while True:
line = log.recv(4096).decode()
parse_line(outfile, line)
Если отправитель сокета уже доставляет строки, завершенные символами новой строки,вы можете преобразовать сокет непосредственно в файл-подобный объекту python с makefile
, как объясняет ответ Даниэля Придена.(Но стандартный файловый объект будет ожидать нахождения «строк» и будет пытаться читать до тех пор, пока не найдет символ конца строки.)
Если он не предоставляет символы новой строки (какс помощью, скажем, стандартного отправителя системного журнала), вы можете создать свой собственный подкласс сокета, который обеспечивает аналогичное поведение с семантикой записи за один раз:
class mysock(socket.socket):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
def __iter__(self):
return self
def __next__(self):
return self.recv(4096).decode()
log = mysock(socket.AF_UNIX, socket.SOCK_DGRAM)
log.bind("/home/log/socket")
with open('current_logs_sql_ready.txt', 'w') as outfile:
for line in log:
parse_line(outfile, line)