Tôi có một phản ứng http từ urllibsuối chặn không hỗ trợ tìm kiếm từ phản ứng http bằng Python
response = urllib2.urlopen('http://python.org/')
Cuối cùng, tôi muốn để có thể seek()
trong phản ứng (ít nhất là đến đầu). Vì vậy, tôi muốn để có thể có mã như thế này:
print result.readline()
result.seek(0)
print result.readline()
Giải pháp đơn giản nhất cho vấn đề này là StringIO
hoặc io.BytesIO
như thế này:
result = io.BytesIO(response.read())
Tuy nhiên, điều được rằng các nguồn lực Tôi muốn yêu cầu có xu hướng rất lớn và tôi muốn bắt đầu làm việc với chúng (phân tích cú pháp ...) trước khi toàn bộ quá trình tải xuống hoàn tất. response.read()
đang chặn. Tôi đang tìm một giải pháp không chặn.
Mã lý tưởng sẽ read(BUFFER_SIZE)
từ tài nguyên và bất cứ khi nào cần thêm nội dung, chỉ cần yêu cầu thêm từ phản hồi. Tôi về cơ bản đang tìm kiếm một lớp bao bọc có thể làm điều đó. Oh, và tôi cần một tập tin như đối tượng.
tôi nghĩ, tôi có thể viết một cái gì đó như:
base = io.BufferedIOBase(response)
result = io.BufferedReader(base)
Tuy nhiên, nó chỉ ra rằng điều này không làm việc và tôi đã thử các lớp khác nhau từ io module nhưng không thể có được nó làm việc. Tôi hài lòng với bất kỳ lớp bao bọc nào có hành vi mong muốn.
1. Bạn sử dụng 'readline()' có khả năng đọc toàn bộ câu trả lời nếu không có ngắt dòng trong đó. 2. Bạn nên kiểm tra xem kích thước của dữ liệu đã lưu ** cộng ** có phải kích thước của đường được lưu không vượt quá 'buffer_size' nếu không bạn có nguy cơ đệm nhiều hơn' buffer_size'. –
@Piotr Dobrogost Cảm ơn bạn đã chỉ ra điều đó. Mã không hoàn chỉnh và chắc chắn không an toàn. Nó thiếu read() và cũng không hỗ trợ phản hồi từ mô-đun yêu cầu. Tuy nhiên, nó phục vụ mục đích. – dominik