1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【Python初心者】ioモジュールでテキストとバイナリをメモリ上で操作してみた

Posted at

io モジュールの使い方についてまとめました。
ファイルのように扱える「仮想ファイルオブジェクト」を使って、テキストやバイナリの操作を試しました。

テキストデータを仮想ファイルとして扱う:io.StringIO

io.StringIO を使うと、文字列をファイルのように扱えます。
たとえばテスト時にダミーのファイルを用意したいときに便利です。

import io

text_data = "これはテスト用の文字列です。\n2行目のテキストです。"
f = io.StringIO(text_data)

# 1行ずつ読み込む
for line in f:
    print("読み込み:", line.strip())
読み込み: これはテスト用の文字列です。
読み込み: 2行目のテキストです。

write() を使って書き込みも可能です。

f = io.StringIO()  # 空の仮想ファイルを用意
f.write("Hello, ")
f.write("World!")
print("内容:", f.getvalue())  # getvalue() で全体を取得
内容: Hello, World!

バイナリデータを仮想ファイルとして扱う:io.BytesIO

バイナリデータを扱うときは io.BytesIO を使います。
画像データや音声データ、バイト列を一時的に扱いたいときに便利です。

import io

binary_data = b'\x00\x01\x02hello\xff'
f = io.BytesIO(binary_data)

# バイナリを読み込んで表示
read = f.read()
print("読み込んだバイト列:", read)
読み込んだバイト列: b'\x00\x01\x02hello\xff'

書き込みも可能です。

f = io.BytesIO()
f.write(b"abc")
f.write(b"123")
print("内容:", f.getvalue())
内容: b'abc123'

標準入力の模擬:sys.stdin = io.StringIO(...)

Pythonでは通常、input() を使うとユーザーのキーボード入力を読み取ります。
その入力元は sys.stdin という「標準入力オブジェクト」です。

この sys.stdinio.StringIO() に差し替えると、キーボードからではなく、指定した文字列から input() を読み取ることができるようになります。

import io
import sys

sys.stdin = io.StringIO("Hello\nWorld\n")
print(input())  # → Hello
print(input())  # → World
Hello
World

このようにして、テストや自動化の場面でユーザー入力を再現することができます。


標準出力のキャプチャ:sys.stdout = io.StringIO()

通常、print() した内容は画面(標準出力)に表示されます。
この出力先は sys.stdout というオブジェクトで管理されています。

sys.stdoutio.StringIO() に差し替えると、print() の内容が画面に出ず、仮想ファイルに書き込まれるようになります。

import sys
import io

sys.stdout = io.StringIO()  # 出力先を仮想ファイルに変更
print("テスト")             # 画面ではなく、StringIOに書き込まれる
result = sys.stdout.getvalue()  # 書き込まれた内容を取得
result に入る値: "テスト\n"

このようにして、print() の出力内容を文字列としてプログラム内で扱えるようになります。

📌 元に戻す方法

標準出力を変更したままだと、後続の print() もすべて StringIO に出力されてしまいます。
以下のように、元に戻すことが推奨されます。

sys.stdout = sys.__stdout__  # 標準出力を元に戻す
print("キャプチャ:", result)
キャプチャ: テスト

おわりに

今回は io.StringIOio.BytesIO を使って、メモリ上でテキストやバイナリをファイルのように扱う方法を学びました。
特に sys.stdinsys.stdout を差し替えて、テスト用に仮想的な入出力を操作できる仕組みはとても便利だと感じました。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?