Pandas & NumPy Academy · บทเรียน

การอ่านจาก URL และ StringIO

โหลดไฟล์ CSV ระยะไกลโดยตรงจาก URL และแยกวิเคราะห์สตริง CSV ในหน่วยความจำด้วย io.StringIO เพื่อการทดสอบ

บทเรียน 4 จาก 413 ขั้นตอน

การอ่านจาก URL และ StringIO เป็นบทเรียน Pandas & NumPy Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Pandas & NumPy Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Pandas & NumPy Academy มีบทเรียนทั้งหมด 4 บทเรียน

การอ่านข้อมูลโดยไม่ดาวน์โหลดไฟล์

คุณไม่จำเป็นต้องบันทึกไฟล์ลงดิสก์ก่อนโหลดเข้า Pandas เสมอไป pd.read_csv(url) รับ URL ของ HTTP หรือ HTTPS ได้โดยตรง และดาวน์โหลดไฟล์ลงใน DataFrame ให้เสร็จในขั้นตอนเดียว วิธีนี้เหมาะอย่างยิ่งสำหรับชุดข้อมูลสาธารณะที่โฮสต์อยู่บน GitHub, data.gov หรือเว็บเซิร์ฟเวอร์ใด ๆ และช่วยให้สมุดบันทึกทำซ้ำได้ — ใคร ๆ ก็สามารถเรียกใช้งานได้โดยไม่ต้องดาวน์โหลดทรัพยากรไว้ล่วงหน้า

import pandas as pd

url = 'https://raw.githubusercontent.com/mwaskom/seaborn-data/master/tips.csv'
df = pd.read_csv(url)
print(df.shape)   # (244, 7)
print(df.head(2))

การอ่าน URL ทำงานภายในอย่างไร

เมื่อคุณส่ง URL ให้กับ read_csv() Pandas จะใช้ไลบรารี urllib หรือ requests ของ Python ภายในเพื่อดาวน์โหลดไบต์ดิบ จากนั้นจะแยกวิเคราะห์เหมือนกับข้อมูลที่มาจากไฟล์ภายในเครื่องทุกประการ ฟังก์ชันการอ่านส่วนใหญ่ (read_excel, read_json, read_parquet) รองรับ URL ไฟล์ที่บีบอัดเป็น .gz หรือ .bz2 จะถูกคลายการบีบอัดโดยอัตโนมัติ

import pandas as pd

# Compressed CSV from URL -- auto-decompressed
url = 'https://example.com/data.csv.gz'
df = pd.read_csv(url, compression='infer')
print(df.shape)

การเพิ่มส่วนหัวคำขอเพื่อยืนยันตัวตน

API บางรายการต้องใช้ส่วนหัวสำหรับยืนยันตัวตน เช่น โทเค็น Bearer หรือคีย์ API การอ่าน URL ของ Pandas ไม่รองรับส่วนหัวแบบกำหนดเองโดยตรง ในกรณีดังกล่าว ให้ใช้ requests ดาวน์โหลดเนื้อหาก่อน แล้วห่อเนื้อหานั้นด้วย io.StringIO ก่อนส่งให้ Pandas รูปแบบสองขั้นตอนนี้ช่วยแยกข้อกังวลด้าน HTTP ออกจากการแยกวิเคราะห์ข้อมูล

import pandas as pd
import requests
import io

headers = {'Authorization': 'Bearer mytoken123'}
response = requests.get('https://api.example.com/export.csv',
                        headers=headers)
df = pd.read_csv(io.StringIO(response.text))
print(df.shape)

io.StringIO คืออะไร

io.StringIO เป็นคลาสในไลบรารีมาตรฐานของ Python ที่สร้างออบเจ็กต์ลักษณะเดียวกับไฟล์ในหน่วยความจำจากสตริง เนื่องจากฟังก์ชันการอ่านของ Pandas ต้องการเส้นทางไฟล์หรือออบเจ็กต์ลักษณะเดียวกับไฟล์ คุณจึงสามารถห่อสตริง CSV ใด ๆ ด้วย StringIO แล้วส่งต่อได้โดยตรง วิธีนี้มีประโยชน์อย่างมากสำหรับการทดสอบ การประมวลผลการตอบกลับจาก API และการแยกวิเคราะห์ข้อมูล CSV ที่สร้างขึ้นแบบไดนามิกด้วยโค้ด Python

import pandas as pd
import io

csv_text = 'name,score\nAlice,90\nBob,75\nCarol,88'
df = pd.read_csv(io.StringIO(csv_text))
print(df)
#     name  score
# 0  Alice     90
# 1    Bob     75
# 2  Carol     88

io.BytesIO สำหรับข้อมูลไบนารี

สำหรับรูปแบบไบนารี เช่น Excel, Parquet หรือ CSV ที่บีบอัด ให้ใช้ io.BytesIO (บัฟเฟอร์ในหน่วยความจำที่อาศัยไบต์) แทน io.StringIO ห่อไบต์ดิบจากการตอบกลับของเครือข่ายหรือจากฟิลด์ BLOB ในฐานข้อมูลด้วย BytesIO แล้วส่งให้ตัวอ่านที่เหมาะสม วิธีนี้ช่วยหลีกเลี่ยงการเขียนไฟล์ชั่วคราวลงดิสก์

import pandas as pd
import requests
import io

# Download an Excel file without saving to disk
response = requests.get('https://example.com/report.xlsx')
buffer = io.BytesIO(response.content)
df = pd.read_excel(buffer, sheet_name='Data')
print(df.shape)

การทดสอบด้วย StringIO

การใช้งานสำคัญอย่างหนึ่งของ StringIO คือในการทดสอบหน่วย โดยฝังสตริง CSV ขนาดเล็กไว้ในฟังก์ชันทดสอบโดยตรง แทนการจัดเตรียมไฟล์ข้อมูลทดสอบ วิธีนี้ทำให้ tests ทำงานได้ในตัวเอง เคลื่อนย้ายได้ และรวดเร็ว ข้อมูลทดสอบจะถูกควบคุมเวอร์ชันไปพร้อมกับโค้ด จึงไม่อาจคลาดเคลื่อนจากไฟล์ภายนอกจนไม่ตรงกันได้

import pandas as pd
import io

def test_clean_names():
    raw = 'name,age\n Alice ,30\nBob ,25'
    df = pd.read_csv(io.StringIO(raw))
    df['name'] = df['name'].str.strip()
    assert df['name'].tolist() == ['Alice', 'Bob']
    print('Test passed')

test_clean_names()

การเขียนลง StringIO สำหรับ CSV ในหน่วยความจำ

คุณสามารถเขียน DataFrame ลงในบัฟเฟอร์ StringIO ด้วย df.to_csv(buffer) เพื่อสร้างสตริง CSV ในหน่วยความจำโดยไม่สร้างไฟล์ เรียก buffer.getvalue() เพื่อดึงสตริงออกมา วิธีนี้มีประโยชน์สำหรับการฝัง CSV ในเนื้อหาอีเมล การส่ง CSV ในการตอบกลับ HTTP หรือการเปรียบเทียบผลลัพธ์ CSV ที่คาดไว้กับผลลัพธ์จริงใน tests

import pandas as pd
import io

df = pd.DataFrame({'x': [1, 2], 'y': [3, 4]})
buffer = io.StringIO()
df.to_csv(buffer, index=False)
csv_string = buffer.getvalue()
print(repr(csv_string))
# 'x,y\n1,3\n2,4\n'

การแคชข้อมูลระยะไกลด้วย Requests-Cache

การดาวน์โหลด URL เดิมซ้ำ ๆ ระหว่างการพัฒนานั้นช้าและสิ้นเปลืองแบนด์วิดท์ ให้ใช้ requests-cache หรือบันทึกการดาวน์โหลดครั้งแรกลงในไฟล์ภายในเครื่อง รูปแบบที่ใช้กันทั่วไปคือ ตรวจสอบว่ามีไฟล์แคชภายในเครื่องอยู่หรือไม่ แล้วใช้ URL เป็นทางเลือกสำรองเฉพาะเมื่อไม่มีไฟล์นั้น วิธีนี้ทำให้การพัฒนาเร็วขึ้น ขณะเดียวกันก็ยังทำให้สามารถเรียกใช้สมุดบันทึกตั้งแต่ต้นได้

import pandas as pd
import os

LOCAL = 'data/tips_cache.csv'
URL = 'https://raw.githubusercontent.com/mwaskom/seaborn-data/master/tips.csv'

if os.path.exists(LOCAL):
    df = pd.read_csv(LOCAL)
else:
    df = pd.read_csv(URL)
    df.to_csv(LOCAL, index=False)
print('Loaded:', df.shape)

การสตรีมไฟล์ระยะไกลขนาดใหญ่

สำหรับไฟล์ CSV ระยะไกลขนาดใหญ่ที่มีขนาดเกินหน่วยความจำ ให้ใช้การสตรีมของ requests ร่วมกับ chunksize สตรีมเนื้อหาการตอบกลับทีละบรรทัดลงในบัฟเฟอร์ StringIO อ่านข้อมูลเป็นส่วน ๆ แล้วประมวลผลเพิ่มทีละส่วน อีกทางเลือกหนึ่งคือดาวน์โหลดโดยตรงด้วย requests ลงในไฟล์ภายในเครื่องเป็นส่วน ๆ จากนั้นใช้การอ่านแบบแบ่งส่วนของ Pandas กับสำเนาภายในเครื่อง

import requests
import io
import pandas as pd

def stream_csv(url, chunksize=10000):
    with requests.get(url, stream=True) as r:
        content = r.content.decode('utf-8')
    for chunk in pd.read_csv(io.StringIO(content), chunksize=chunksize):
        yield chunk

การอ่าน URL หลายรายการแบบขนาน

เมื่อคุณต้องรวมชุดข้อมูลจาก URL หลายรายการ การอ่านทีละรายการจะช้า ให้ใช้ concurrent.futures.ThreadPoolExecutor ของ Python เพื่อดาวน์โหลดและแยกวิเคราะห์ URL หลายรายการพร้อมกัน จากนั้นรวมผลลัพธ์ด้วย pd.concat() สำหรับการแยกวิเคราะห์ไฟล์ขนาดใหญ่จำนวนมากที่ใช้ CPU หนัก ProcessPoolExecutor อาจทำงานได้เร็วกว่า

import pandas as pd
from concurrent.futures import ThreadPoolExecutor

urls = [
    'https://example.com/data_jan.csv',
    'https://example.com/data_feb.csv',
]

with ThreadPoolExecutor(max_workers=4) as ex:
    dfs = list(ex.map(pd.read_csv, urls))
combined = pd.concat(dfs, ignore_index=True)
print(combined.shape)

ข้อควรพิจารณาด้านความปลอดภัยสำหรับ URL ระยะไกล

การอ่านจาก URL ที่ไม่น่าเชื่อถือมีความเสี่ยง เช่น เซิร์ฟเวอร์ที่เป็นอันตรายอาจเปลี่ยนเส้นทางไปยังรูปแบบที่ไม่คาดคิด ให้บริการไฟล์ขนาดใหญ่มากจนใช้หน่วยความจำหมด หรือแทรกเนื้อหาที่ทำให้ตัวแยกวิเคราะห์สับสน โปรดตรวจสอบรูปแบบของ URL เสมอ (ข้อมูลที่มีความละเอียดอ่อนต้องใช้ HTTPS) กำหนดระยะหมดเวลาในการดาวน์โหลด และจำกัดจำนวนแถวด้วย nrows= เมื่อสำรวจ URL ที่ไม่คุ้นเคยเป็นครั้งแรก

import pandas as pd
import requests
import io

url = 'https://trusted-source.example.com/data.csv'
response = requests.get(url, timeout=30)  # 30-second timeout
response.raise_for_status()              # raise on HTTP error
df = pd.read_csv(io.StringIO(response.text), nrows=1000)
print(df.shape)

ตรวจสอบความเข้าใจอย่างรวดเร็ว

ทดสอบความเข้าใจเกี่ยวกับการอ่านจาก URL และ StringIO จากบทเรียนนี้

สรุปบทเรียน

ในบทเรียนนี้ คุณได้เรียนรู้ว่า pd.read_csv() รองรับ URL ของ HTTP/HTTPS โดยตรงโดยไม่จำเป็นต้องดาวน์โหลดไฟล์ก่อน io.StringIO ใช้ห่อสตริง CSV ให้เป็นออบเจ็กต์ลักษณะเดียวกับไฟล์ เพื่อให้ Pandas แยกวิเคราะห์ข้อมูลจากหน่วยความจำได้ และ io.BytesIO ทำเช่นเดียวกันสำหรับรูปแบบไบนารีอย่าง Excel และ Parquet บทเรียนนี้เป็นการจบหลักสูตรการอ่านและการเขียนข้อมูล — บทถัดไป เราจะกรอง DataFrames อย่างแม่นยำด้วยการทำดัชนีแบบบูลีนและเมธอด query()

เริ่มต้นได้ฟรี

เรียนรู้ Python ด้วย AI tutor — ฟรี

เขียนและเรียกใช้โค้ดจริงในเบราว์เซอร์ของคุณ รับความช่วยเหลือทันทีจาก AI tutor 24/7 และเรียนรู้ต่อจากที่คุณหยุดบนเว็บหรือในแอป

คอร์ส
30
บทเรียน
120

คำถามที่พบบ่อย

บทเรียน “การอ่านจาก URL และ StringIO” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “การอ่านจาก URL และ StringIO” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Pandas & NumPy Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Pandas & NumPy Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “การอ่านจาก URL และ StringIO”

โหลดไฟล์ CSV ระยะไกลโดยตรงจาก URL และแยกวิเคราะห์สตริง CSV ในหน่วยความจำด้วย io.StringIO เพื่อการทดสอบ คุณปฏิบัติ Pandas & NumPy Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Pandas & NumPy Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน Pandas & NumPy Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน

บทเรียน “การอ่านจาก URL และ StringIO” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน Pandas & NumPy Academy นี้ได้ไหม

ได้ บทเรียน Pandas & NumPy Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. การอ่านไฟล์ CSV
  2. การอ่านไฟล์ Excel และ JSON
  3. การเขียน DataFrames ลงไฟล์
  4. การอ่านจาก URL และ StringIO
← กลับไปที่ Pandas & NumPy Academy