Python Requests və csv.reader ilə çoxsətirli CSV qeydlərini axınla emal edin
Proksidən keçən cavabı csv.reader-a axınla verin və hər fiziki sətri ayırıcıda bölmək əvəzinə qeyd sərhədlərini qoruyun.
stream=True, proksidən keçən cavab gövdəsi tam yüklənməmişdən əvvəl emalın başlamasına imkan verir. CSV üçün csv.reader-a mətn sətiri iteratoru ötürün ki, dırnaq içindəki ayırıcılar və çoxsətirli qeydlər CSV verisi olaraq qalsın.
Nöqtəli vergül istifadə edən nümunəvi UTF-8 faylı üçün:
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
Faylın faktiki kodlaşdırmasını və dialektini seçin. İcazəli ictimai proksi marşrutu üzərində ictimai CSV yükləməsi üçün HTTP proksi siyahısı routes URL-i üçün namizədlər təqdim edir. Bu versiya fiziki sətir sonlarını LF-ə normallaşdırır: iter_lines onları silir, generator isə CSV parseri üçün yeni sətir əlavə edir. Bu, dırnaq içindəki sahə başqa fiziki sətrə davam etdikdə vacibdir.
Daxil edilmiş CRLF simvollarının bayt dəqiqliyi ilə saxlanmasını tələb edən iş axınları üçün həmin sətir sonlarını qoruyan axınlı mətn sarğısı quruluşundan istifadə edin. Nümunənin qəsdən normallaşdırması LF-in nəzərdə tutulan təsvir olduğu qeyd yönümlü emal üçün uyğundur.
Bir cavab, çox oxunuş
Iterator bir HTTP cavabından parçalar istehlak edir. Hər sətir üçün yeni sorğu göndərmir. HTTP Range sorğuları fərqli mexanizmdir və CSV qeyd sərhədlərini təbii olaraq müəyyən etmir.
response.text çağırmaq və ya bütün sətirləri siyahıya yığmaq tam məzmunu yenidən yaddaşa gətirərdi. Axın hələ də nəqliyyat buferləri və cari qeyd üçün yerə ehtiyac duyur; qeydin özü böyük sahə saxlaya bilər.
Cavab konteksti dövrə çıxdıqda gövdəni bağlayır, erkən uyğunluq da daxil olmaqla. Oxuma taym-autu gələn məlumatı gözləməni məhdudlaşdırır, böyük fayl ötürülməsinin ümumi ömrünü deyil.