stream=True מאפשר להתחיל בעיבוד לפני שגוף התגובה דרך פרוקסי הורד במלואו. עבור CSV, העבירו איטרטור של שורות טקסט אל csv.reader כדי שמפרידים בתוך מרכאות ורשומות מרובות שורות יישארו נתוני CSV.

עבור קובץ UTF-8 להמחשה המשתמש בנקודות-פסיק:

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

בחרו את הקידוד והדיאלקט בפועל של הקובץ. עבור הורדת CSV ציבורית בנתיב פרוקסי ציבורי מורשה, רשימת פרוקסי ה-HTTP מספקת מועמדים עבור כתובת ה-routes. גרסה זו מנרמלת סופי שורות פיזיים ל-LF: iter_lines מסיר אותם, והמחולל מוסיף בחזרה שורה חדשה עבור מנתח ה-CSV. זה חשוב כאשר שדה בתוך מרכאות ממשיך לשורה פיזית אחרת.

עבור תהליכי עבודה הדורשים שימור מדויק ברמת בתים של תווי CRLF מוטבעים, השתמשו במעטפת טקסט זורמת ששומרת על סופי השורות הללו. הנרמול המכוון שבדוגמה מתאים לעיבוד מוכוון רשומות שבו LF הוא הייצוג המיועד.

תגובה אחת, קריאות רבות

האיטרטור צורך מקטעים מתגובת HTTP אחת. הוא אינו שולח בקשה חדשה עבור כל שורה. בקשות HTTP Range הן מנגנון אחר ואינן מזהות באופן טבעי גבולות של רשומות CSV.

קריאה ל-response.text או איסוף כל השורות לרשימה הייתה מחזירה את כל התוכן חזרה לזיכרון. הזרמה עדיין זקוקה למקום עבור חוצצי תעבורה והרשומה הנוכחית, שיכולה בעצמה להכיל שדה גדול.

הקשר התגובה סוגר את הגוף ביציאה מהלולאה, כולל בהתאמה מוקדמת. זמן הקריאה מגביל את ההמתנה לנתונים נכנסים, ולא את משך החיים הכולל של העברת קובץ גדול.

מאמרים קשורים