Выход сокета усекается до следующего файла

1

У меня есть этот неограниченный цикл, который читается из сокета. Каждую минуту я меняю местоположение записи на следующую минуту.

Проблема в том, что моя последняя строка в потоке усекается посередине и помещается в следующий файл. Есть ли способ, которым я могу сказать, чтобы он остановился только на новой линии вместо того, чтобы посередине?

while ok:
    filename1 = datetime.datetime.now().strftime("FILE.0000.%Y.%m.%d.%H.%M.txt")
    path="/tmp/" + filename1
    file1 = open(path,"a")
    ready_to_read, ready_to_write, in_error = select.select(readers, [ ], readers, 300) 

    for s in ready_to_read: 
        line = s.recv(1024)
        if line:
            file1.write(line)
        else:
            ok = False

    file1.flush()
    file1.close()
  • 0
    взяв самую правую часть последнего перевода строки, не записывая ее, а сохраняя для следующего файла.
Теги:

2 ответа

1
Лучший ответ

Если у вас есть только один сокет, select не нужно. Используйте makefile и строки чтения:

handle = reader.makefile()
for line in handle:
    filename = "FILE.0000.{:%Y.%m.%d.%H.%M}.txt".format(datetime.datetime.now())
    with open(os.path.join('/tmp', filename), "a") as output:
        output.write(line)
  • 0
    Это прекрасно, спасибо. Очень красиво и чисто.
0

я мог бы

  • писать только левую часть последней строки
  • сохранить переменную "последняя строка" для записи в следующий файл

Например, используя str.rpartition:

>>> left_part,_,remaining_line = "a\nb\nc".rpartition("\n")
>>> left_part
'a\nb'
>>> remaining_line
'c'

как это:

remaining_line = ""
while ok:
    filename1 = datetime.datetime.now().strftime("FILE.0000.%Y.%m.%d.%H.%M.txt")
    path="/tmp/" + filename1
    with open(path,"a") as f:
       if remaining_line:
          file1.write(remaining_line)

       for s in ready_to_read: 
           line = s.recv(1024)
           if line:
              left_part,_,remaining_line = line.rpartition("\n");
              file1.write(left_part)
              file1.write("\n")
           else:
              ok = False

обратите внимание, что вы должны что-то сделать с последней remaining_line (когда ok - False), если это необходимо.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню