У меня есть этот неограниченный цикл, который читается из сокета. Каждую минуту я меняю местоположение записи на следующую минуту.
Проблема в том, что моя последняя строка в потоке усекается посередине и помещается в следующий файл. Есть ли способ, которым я могу сказать, чтобы он остановился только на новой линии вместо того, чтобы посередине?
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()
Если у вас есть только один сокет, 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)
я мог бы
Например, используя 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
), если это необходимо.