Truyền phát bản ghi CSV nhiều dòng với Python Requests và csv.reader
Truyền phát phản hồi qua proxy vào csv.reader và giữ nguyên ranh giới bản ghi thay vì tách mỗi dòng vật lý tại dấu phân cách.
stream=True cho phép bắt đầu xử lý trước khi phần thân của phản hồi qua proxy được tải xuống hoàn toàn. Với CSV, hãy truyền một trình lặp dòng văn bản cho csv.reader để các dấu phân cách trong dấu ngoặc kép và bản ghi nhiều dòng vẫn là dữ liệu CSV.
Với một tệp UTF-8 minh họa dùng dấu chấm phẩy:
import csv
import requests
routes = {'https': 'http://proxy.example:8080'}
with requests.get(
'https://data.example/observations.csv',
proxies=routes,
stream=True,
timeout=(5, 30),
) as response:
response.raise_for_status()
response.encoding = 'utf-8'
lines = (
line + '\n'
for line in response.iter_lines(
chunk_size=65536, decode_unicode=True)
)
for record in csv.reader(lines, delimiter=';'):
if record and record[0] == 'wanted':
print(record)
break
Chọn mã hóa và phương ngữ thực tế của tệp. Đối với tải CSV công khai qua một tuyến proxy công khai được phép, danh sách proxy HTTP cung cấp các ứng viên cho URL routes. Phiên bản này chuẩn hóa các kết thúc dòng vật lý thành LF: iter_lines loại bỏ chúng, và bộ tạo thêm lại một dòng mới cho bộ phân tích CSV. Điều đó quan trọng khi một trường trong dấu ngoặc kép tiếp tục sang một dòng vật lý khác.
Đối với các quy trình yêu cầu bảo toàn chính xác đến từng byte các ký tự CRLF nhúng, hãy dùng một cấu trúc bọc văn bản dạng truyền phát giữ nguyên các kết thúc dòng đó. Việc chuẩn hóa có chủ đích trong ví dụ phù hợp với xử lý hướng bản ghi nơi LF là cách biểu diễn dự kiến.
Một phản hồi, nhiều lần đọc
Trình lặp tiêu thụ các khối từ một phản hồi HTTP. Nó không phát một yêu cầu mới cho mỗi dòng. Các yêu cầu HTTP Range là một cơ chế khác và không tự nhiên nhận diện ranh giới bản ghi CSV.
Gọi response.text hoặc thu thập tất cả các hàng vào một danh sách sẽ đưa toàn bộ nội dung trở lại bộ nhớ. Truyền phát vẫn cần chỗ cho bộ đệm vận chuyển và bản ghi hiện tại, vốn có thể chứa một trường lớn.
Ngữ cảnh phản hồi đóng phần thân khi vòng lặp thoát, kể cả khi khớp sớm. Thời gian chờ đọc giới hạn việc chờ dữ liệu đến, không phải toàn bộ vòng đời của một lần truyền tệp lớn.