Чтение из URL и StringIO
Загружайте удалённые CSV-файлы непосредственно по URL и разбирайте хранящиеся в памяти строки CSV с помощью io.StringIO для тестирования
«Чтение из 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 88io.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 — локальная установка не требуется.
Все уроки этого курса
- Чтение CSV-файлов
- Чтение файлов Excel и JSON
- Запись DataFrames в файлы
- Чтение из URL и StringIO