URLとStringIOからの読み込み
URLからリモートのCSVファイルを直接読み込み、テスト用にio.StringIOを使ってメモリ上のCSV文字列を解析します。
「URLとStringIOからの読み込み」はCoddyKit上の無料Pandas & NumPy Academyレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはPandas & NumPy Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Pandas & NumPy Academyコースには全4レッスンが含まれています。
ファイルをダウンロードせずにデータを読み込む
Pandasに読み込む前に、必ずしもファイルをディスクに保存する必要はありません。pd.read_csv(url)にはHTTPまたはHTTPSのURLを直接渡すことができ、1ステップでファイルをダウンロードしてDataFrameに読み込めます。これは、GitHub、data.gov、その他のWebサーバーで公開されているデータセットに最適です。また、ノートブックの再現性も高まります。事前にデータをダウンロードしなくても、誰でも実行できるためです。
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読み込みの内部動作
read_csv()にURLを渡すと、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キー)が必要です。PandasのURL読み込みは、カスタムヘッダーに直接対応していません。その場合は、requestsを使って先にコンテンツをダウンロードし、io.StringIOでラップしてからPandasに渡してください。この2段階のパターンにより、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レスポンスの処理、Pythonコードで動的に生成したCSVデータの解析に非常に役立ちます。
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.StringIOではなくio.BytesIO(バイト列を扱うメモリ上のバッファー)を使用します。ネットワークレスポンスやデータベースの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の重要な用途の1つは単体テストです。フィクスチャファイルを用意する代わりに、小さな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()メモリ上のCSV用にStringIOへ書き込む
df.to_csv(buffer)を使うと、DataFrameをStringIOバッファーに書き込み、ファイルを作成せずにメモリ上でCSV文字列を生成できます。buffer.getvalue()を呼び出すと、文字列を取得できます。これは、メール本文へのCSVの埋め込み、HTTPレスポンスでの送信、テストで期待するCSV出力と実際の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を組み合わせます。レスポンスの内容を1行ずつ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からデータセットを結合する場合、順番に読み込むと時間がかかります。Pythonのconcurrent.futures.ThreadPoolExecutorを使って複数の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が必須です)、ダウンロードにタイムアウトを設定してください。また、初めて扱う不慣れなURLを調べるときは、nrows=で行数を制限してください。
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()は、ファイルを先にダウンロードしなくてもHTTP/HTTPSのURLを直接受け取れます。io.StringIOはCSV文字列をファイル風オブジェクトでラップするため、Pandasはメモリ上で解析できます。また、io.BytesIOはExcelやParquetなどのバイナリ形式に対して同じ役割を果たします。これで「データの読み込みと書き込み」コースは完了です。次は、ブールインデックスとquery()メソッドを使って、DataFrameを正確にフィルタリングします。
よくある質問
「URLとStringIOからの読み込み」レッスンは無料ですか?
はい。「URLとStringIOからの読み込み」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Pandas & NumPy Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Pandas & NumPy Academyコースには全4レッスンが含まれています。
「URLとStringIOからの読み込み」で何を学びますか?
URLからリモートのCSVファイルを直接読み込み、テスト用にio.StringIOを使ってメモリ上のCSV文字列を解析します。 ブラウザで直接実行するハンズオンコードでPandas & NumPy Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Pandas & NumPy Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのPandas & NumPy Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。
「URLとStringIOからの読み込み」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このPandas & NumPy Academyレッスンでコードを書いて実行できますか?
はい。すべてのPandas & NumPy Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- CSVファイルの読み込み
- ExcelとJSONファイルの読み込み
- DataFrameのファイルへの書き出し
- URLとStringIOからの読み込み