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
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 88io.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 chunkRó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().
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
- Odczytywanie plików CSV
- Odczytywanie plików Excel i JSON
- Zapisywanie DataFrame do plików
- Odczytywanie z adresów URL i StringIO