Pandas & NumPy Academy · Lekcja

Odczytywanie z adresów URL i StringIO

Wczytywać zdalne pliki CSV bezpośrednio z adresu URL oraz analizować przechowywane w pamięci ciągi CSV za pomocą io.StringIO na potrzeby testów

Lekcja 4 z 413 kroki

Odczytywanie z adresów URL i StringIO to bezpłatna lekcja Pandas & NumPy Academy na CoddyKit. To lekcja 4 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Pandas & NumPy Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Pandas & NumPy Academy zawiera 4 lekcji w sumie.

Odczytywanie danych bez pobierania plików

Nie zawsze trzeba zapisywać plik na dysku przed wczytaniem go do Pandas. pd.read_csv(url) bezpośrednio przyjmuje adres URL HTTP lub HTTPS i w jednym kroku pobiera plik do obiektu DataFrame. Jest to idealne rozwiązanie w przypadku publicznych zbiorów danych hostowanych w GitHub, data.gov lub na dowolnym serwerze WWW. Dzięki temu notebooki są powtarzalne — każdy może je uruchomić bez wcześniejszego pobierania zasobów.

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))

Jak odczytywanie z adresu URL działa wewnętrznie

Po przekazaniu adresu URL do read_csv() Pandas wewnętrznie używa biblioteki urllib języka Python lub biblioteki requests do pobrania surowych bajtów, a następnie analizuje je dokładnie tak, jakby pochodziły z pliku lokalnego. Większość funkcji odczytu (read_excel, read_json, read_parquet) obsługuje adresy URL. Pliki skompresowane za pomocą .gz lub .bz2 są automatycznie rozpakowywane.

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)

Dodawanie nagłówków żądania do uwierzytelniania

Niektóre interfejsy API wymagają nagłówków uwierzytelniania, takich jak tokeny Bearer lub klucze API. Odczytywanie adresów URL przez Pandas nie obsługuje bezpośrednio niestandardowych nagłówków. W takich przypadkach należy użyć requests do wcześniejszego pobrania zawartości, a następnie opakować ją w io.StringIO przed przekazaniem do Pandas. Ten dwuetapowy wzorzec oddziela kwestie komunikacji HTTP od analizy danych.

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)

Czym jest io.StringIO?

io.StringIO to klasa biblioteki standardowej języka Python, która tworzy obiekt podobny do pliku przechowywany w pamięci na podstawie ciągu znaków. Ponieważ funkcje odczytu Pandas oczekują ścieżki pliku albo obiektu podobnego do pliku, można opakować dowolny ciąg CSV w StringIO i przekazać go bezpośrednio. Jest to niezwykle przydatne podczas testowania, przetwarzania odpowiedzi API oraz analizowania danych CSV generowanych dynamicznie przez kod Pythona.

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 dla danych binarnych

W przypadku formatów binarnych, takich jak Excel, Parquet lub skompresowany CSV, należy użyć io.BytesIO (bufora przechowywanego w pamięci i opartego na bajtach) zamiast io.StringIO. Surowe bajty z odpowiedzi sieciowej lub pola BLOB w bazie danych można opakować w BytesIO i przekazać do odpowiedniej funkcji odczytu. Pozwala to uniknąć zapisywania plików tymczasowych na dysku.

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)

Testowanie za pomocą StringIO

Jednym z ważnych zastosowań StringIO są testy jednostkowe: niewielkie ciągi CSV można umieszczać bezpośrednio w funkcji testowej zamiast dostarczać pliki z danymi testowymi. Dzięki temu testy są samodzielne, przenośne i szybkie. Dane testowe są przechowywane w systemie kontroli wersji razem z kodem i nie mogą rozjechać się z zewnętrznym plikiem.

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()

Zapisywanie do StringIO w celu utworzenia CSV w pamięci

Można zapisać obiekt DataFrame do bufora StringIO za pomocą df.to_csv(buffer), aby utworzyć w pamięci ciąg CSV bez tworzenia pliku. Wywołaj buffer.getvalue(), aby pobrać ten ciąg. Jest to przydatne do umieszczania CSV w treści wiadomości e-mail, wysyłania go w odpowiedzi HTTP lub porównywania oczekiwanego i rzeczywistego wyniku CSV w testach.

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'

Buforowanie zdalnych danych za pomocą Requests-Cache

Wielokrotne pobieranie tego samego adresu URL podczas pracy nad projektem jest powolne i niepotrzebnie zużywa przepustowość. Użyj requests-cache albo zapisz pierwsze pobranie w pliku lokalnym. Typowy wzorzec polega na sprawdzeniu, czy lokalny plik pamięci podręcznej istnieje, i użyciu adresu URL tylko wtedy, gdy go nie ma. Dzięki temu praca nad projektem przebiega szybko, a notebooki nadal można uruchomić od początku.

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)

Strumieniowe przetwarzanie dużych zdalnych plików

W przypadku dużych zdalnych plików CSV, które nie mieszczą się w pamięci, połącz strumieniowanie requests z parametrem chunksize. Przesyłaj zawartość odpowiedzi wiersz po wierszu do bufora StringIO, odczytuj fragmenty i przetwarzaj je przyrostowo. Możesz też pobrać plik bezpośrednio za pomocą requests do pliku lokalnego, zapisując go fragmentami, a następnie użyć odczytu fragmentami Pandas na lokalnej kopii.

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

Równoległe odczytywanie wielu adresów URL

Gdy trzeba połączyć zbiory danych z wielu adresów URL, ich sekwencyjne odczytywanie jest powolne. Użyj concurrent.futures.ThreadPoolExecutor języka Python, aby równocześnie pobrać i przeanalizować wiele adresów URL, a następnie połączyć wyniki za pomocą pd.concat(). W przypadku obciążonej obliczeniowo analizy wielu dużych plików szybszy może być 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)

Kwestie bezpieczeństwa dotyczące zdalnych adresów URL

Odczytywanie danych z niezaufanych adresów URL wiąże się z ryzykiem: złośliwy serwer może przekierować żądanie do nieoczekiwanego formatu, udostępnić niezwykle duży plik wyczerpujący pamięć lub wstrzyknąć zawartość, która zdezorientuje analizator. Zawsze sprawdzaj schemat adresu URL (w przypadku wrażliwych danych musi to być HTTPS), ustaw limit czasu pobierania i ogranicz liczbę wierszy za pomocą nrows=, gdy po raz pierwszy analizujesz nieznany adres 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)

Szybkie sprawdzenie

Sprawdź swoją wiedzę na temat odczytywania danych z adresów URL i używania StringIO z tego rozdziału.

Podsumowanie rozdziału

W tym rozdziale nauczyłeś się, że: pd.read_csv() bezpośrednio przyjmuje adresy URL HTTP/HTTPS, więc nie trzeba najpierw pobierać plików, io.StringIO opakowuje ciąg CSV w obiekt podobny do pliku, dzięki czemu Pandas może przeanalizować go w pamięci, a io.BytesIO działa tak samo w przypadku formatów binarnych, takich jak Excel i Parquet. To kończy kurs Reading and Writing Data — w następnej części nauczymy się precyzyjnie filtrować obiekty DataFrame za pomocą indeksowania boolowskiego i metody query().

Bezpłatny start

Ucz się Python dzięki korepetycjom AI — za darmo

Pisz i uruchamiaj kod w przeglądarce, otrzymuj natychmiastową pomoc od korepetytora AI dostępnego 24/7 i kontynuuj naukę w sieci lub w aplikacji.

Kursy
30
Lekcje
120

Często zadawane pytania

Czy lekcja „Odczytywanie z adresów URL i StringIO” jest bezpłatna?

Tak — pełny tekst „Odczytywanie z adresów URL i StringIO” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Pandas & NumPy Academy, przejdź na CoddyKit PRO. Kurs Pandas & NumPy Academy zawiera 4 lekcji w sumie.

Co nauczysz się w „Odczytywanie z adresów URL i StringIO”?

Wczytywać zdalne pliki CSV bezpośrednio z adresu URL oraz analizować przechowywane w pamięci ciągi CSV za pomocą io.StringIO na potrzeby testów Ćwiczysz Pandas & NumPy Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć Pandas & NumPy Academy?

Nie wymagamy żadnego doświadczenia. Pandas & NumPy Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 4 z 4.

Ile czasu zajmuje lekcja „Odczytywanie z adresów URL i StringIO”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji Pandas & NumPy Academy?

Tak. Każda lekcja Pandas & NumPy Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. Odczytywanie plików CSV
  2. Odczytywanie plików Excel i JSON
  3. Zapisywanie DataFrame do plików
  4. Odczytywanie z adresów URL i StringIO
← Powrót do Pandas & NumPy Academy