Το 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 με ακρίβεια byte, χρησιμοποιήστε μια διάταξη περιτυλίγματος κειμένου σε ροή που διατηρεί αυτές τις καταλήξεις γραμμών. Η σκόπιμη κανονικοποίηση του παραδείγματος ταιριάζει σε επεξεργασία προσανατολισμένη σε εγγραφές όπου το LF είναι η επιδιωκόμενη αναπαράσταση.

Μία απόκριση, πολλές αναγνώσεις

Ο επαναλήπτης καταναλώνει τμήματα από μία απόκριση HTTP. Δεν εκδίδει νέο αίτημα για κάθε γραμμή. Τα αιτήματα HTTP Range είναι διαφορετικός μηχανισμός και δεν εντοπίζουν από μόνα τους τα όρια των εγγραφών CSV.

Η κλήση του response.text ή η συλλογή όλων των γραμμών σε λίστα θα έφερνε ολόκληρο το περιεχόμενο πίσω στη μνήμη. Η ροή χρειάζεται ακόμη χώρο για προσωρινά αρχεία μεταφοράς και την τρέχουσα εγγραφή, η οποία μπορεί να περιέχει μεγάλο πεδίο.

Το περιβάλλον της απόκρισης κλείνει το σώμα όταν εξέλθει ο βρόχος, ακόμη και σε πρώιμη αντιστοίχιση. Το όριο χρόνου ανάγνωσης περιορίζει την αναμονή εισερχόμενων δεδομένων, όχι τη συνολική διάρκεια μεταφοράς μεγάλου αρχείου.

Σχετικά άρθρα