Как использовать генератор для разделения данных чтения сокетов на новые строки - PullRequest
5 голосов
/ 01 мая 2011

У меня есть простой генератор, который читает данные из сокета и выдает каждый кусок данных по мере их поступления.

while True:
    data = s.recv(512)
    if not data:
        break
    yield data

Данные выглядят как CSV-файл и содержат новые строки. Как я могу изменить свой код, чтобы получить строки текста вместо размера буфера? Я играл с split ('\ n'), но всегда зацикливался на том, как обнаружить тот факт, что последний фрагмент может быть не полной строкой, и мне нужно ждать следующего фрагмента данных.

Спасибо.

1 Ответ

5 голосов
/ 01 мая 2011

Вы можете вызвать socket.makefile(), а затем поработать с файловым объектом (либо выполнить итерации по строкам, либо вызвать .readline()):

import socket
from contextlib import closing

with closing(socket.socket(socket.AF_INET, socket.SOCK_STREAM)) as s:
    s.connect(("127.0.0.1", 8080))
    s.sendall("GET / HTTP/1.0\r\n\r\n")

    with closing(s.makefile()) as f: #NOTE: closed independently
        for line in f:
            print line,

    s.shutdown(socket.SHUT_WR)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...