สตรีมระเบียน CSV หลายบรรทัดด้วย Python Requests และ csv.reader
สตรีมการตอบกลับผ่านพร็อกซีเข้าสู่ csv.reader และรักษาขอบเขตของระเบียนแทนการแบ่งแต่ละบรรทัดทางกายภาพที่ตัวคั่น
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 มีผู้สมัครสำหรับ URL routes เวอร์ชันนี้ปรับบรรทัดจบทางกายภาพให้เป็น LF: iter_lines จะลบออก และตัวสร้างจะเพิ่มบรรทัดใหม่กลับให้ตัวแยกวิเคราะห์ CSV สิ่งนี้สำคัญเมื่อฟิลด์ในเครื่องหมายคำพูดต่อเนื่องไปยังอีกบรรทัดทางกายภาพ
สำหรับเวิร์กโฟลว์ที่ต้องการรักษาอักขระ CRLF ที่ฝังอยู่ให้แม่นยำระดับไบต์ ให้ใช้อุปกรณ์ห่อข้อความแบบสตรีมที่รักษาการจบบรรทัดเหล่านั้นไว้ การปรับให้เป็นมาตรฐานโดยเจตนาในตัวอย่างเหมาะกับการประมวลผลที่เน้นระเบียนซึ่ง LF เป็นการแทนค่าที่ต้องการ
หนึ่งการตอบกลับ หลายการอ่าน
ตัววนซ้ำใช้ชิ้นข้อมูลจากการตอบกลับ HTTP เพียงครั้งเดียว ไม่ได้ส่งคำขอใหม่สำหรับทุกบรรทัด คำขอ HTTP Range เป็นกลไกอื่นและไม่ได้ระบุขอบเขตระเบียน CSV ตามธรรมชาติ
การเรียก response.text หรือรวบรวมทุกแถวไว้ในรายการจะนำเนื้อหาทั้งหมดกลับเข้าหน่วยความจำ การสตรีมยังต้องใช้พื้นที่สำหรับบัฟเฟอร์การขนส่งและระเบียนปัจจุบัน ซึ่งอาจมีฟิลด์ขนาดใหญ่ได้เอง
บริบทการตอบกลับจะปิดเนื้อหาเมื่อออกจากลูป รวมถึงเมื่อพบรายการตรงแต่เนิ่น เลกเวลาการอ่านจำกัดการรอข้อมูลขาเข้า ไม่ใช่อายุทั้งหมดของการถ่ายโอนไฟล์ขนาดใหญ่