Pandas & NumPy Academy · Урок

Чтение из URL и StringIO

Загружайте удалённые CSV-файлы непосредственно по URL и разбирайте хранящиеся в памяти строки CSV с помощью io.StringIO для тестирования

Урок 4 из 413 шагов

«Чтение из URL и StringIO» — бесплатный урок Pandas & NumPy Academy на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 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 использует внутри Python-модуль urllib или библиотеку requests, чтобы загрузить необработанные байты, а затем разбирает их так же, как если бы они поступили из локального файла. Большинство функций чтения (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 непосредственно в функцию теста вместо того, чтобы предоставлять файлы с тестовыми данными. Благодаря этому тесты становятся самодостаточными, переносимыми и быстрыми. Тестовые данные хранятся в системе контроля версий вместе с кодом и не могут рассинхронизироваться с внешним файлом.

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 в тело электронного письма, отправки его в HTTP-ответе или сравнения ожидаемого и фактического вывода CSV в тестах.

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 с ИИ-репетитором — бесплатно

Пиши и запускай код прямо в браузере, получай мгновенную помощь от ИИ-репетитора 24/7 и продолжи учиться на сайте или в приложении.

Курсы
30
Уроки
120

Часто задаваемые вопросы

Урок «Чтение из URL и StringIO» бесплатный?

Да — полный текст урока «Чтение из URL и StringIO» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Pandas & NumPy Academy, подпишись на CoddyKit PRO. Курс Pandas & NumPy Academy содержит 4 уроков всего.

Чему я научусь в уроке «Чтение из URL и StringIO»?

Загружайте удалённые CSV-файлы непосредственно по URL и разбирайте хранящиеся в памяти строки CSV с помощью io.StringIO для тестирования Ты практикуешь Pandas & NumPy Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 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