Python 文字列変換: str から int, float, bytes, list, tuple, set, dict, 日付への変換
この記事では、Pythonの文字列を他のデータ型に変換する方法を学びます。
Python の文字列は、クライアントとやりとりする過程で重要な役割を果たします。
input()
関数から受け取るデータ、XML、Web APIからのJSONデータは、最初はすべて文字列としてフォーマットされています。
バックエンドサーバは文字列を解釈または解析し、必要なデータ型に変換し、必要なアクションを実行しなければなりません。
>>> name = input("What is your name?: ")
What is your name? John
>>> type(name)
<class 'str'>
1. 数値への変換
Pythonの文字列を希望する形式の数値に変換する方法から始めましょう。
すべての数値変換は失敗する可能性があります。失敗すると例外がスローされるので、例外処理を常に含める必要があります。 以下のサンプルコードはすべて例外処理を含んでいます。
1.1. 整数
Python の文字列を整数に変換するには int()
コンストラクタを使います。
コンストラクタは、特定のPythonクラスのオブジェクトを作成するために使用される特別な関数です。コンストラクタについてはクラスの記事で説明します。
以下は、整数変換に成功した例である。
str_one_hundred = "100"
str_minus_five = "-5"
try:
one_hundred = int(str_one_hundred)
minus_five = int(str_minus_five)
except ValueError:
print(f"Couldn't cast {repr(str_one_hundred)} to a number")
print(f"Couldn't cast {repr(str_minus_five)} to a number")
else:
print(f"one_hundred: {one_hundred}")
print(f"minus_five: {minus_five}")
# Output:
# one_hundred: 100
# minus_five: -5
整数変換の失敗例
str_alphabet = "abc"
try:
alphabet = int(str_alphabet)
except ValueError:
print(f"Couldn't cast {repr(str_alphabet)} to a number")
else:
print(f"alphabet: {alphabet}")
# Output:
# Couldn't cast 'abc' to a number
1.2. 実数
Python の文字列を実数に変換するには float()
コンストラクタを使います。
以下は実数への変換に成功した例です。
str_three_point_two_four = "3.24"
str_zero_point_one_two = "-0.12"
try:
three_point_two_four = float(str_three_point_two_four)
zero_point_one_two = float(str_zero_point_one_two)
except ValueError:
print(f"Couldn't cast {repr(str_three_point_two_four)} to a float")
print(f"Couldn't cast {repr(str_zero_point_one_two)} to a float")
else:
print(f"three_point_two_four: {three_point_two_four}")
print(f"zero_point_one_two: {zero_point_one_two}")
# Output:
# three_point_two_four: 3.24
# zero_point_one_two: -0.12
整数変換の失敗例
str_alphabet = "abc"
try:
alphabet = float(str_alphabet)
except ValueError:
print(f"Couldn't cast {repr(str_alphabet)} to a float")
else:
print(f"alphabet: {alphabet}")
# Output:
# Couldn't cast 'abc' to a float
1.3. バイナリ
Python は独自のバイナリデータ型をサポートしていません。 そのため、バイナリ文字列を管理するには整数型に変換する必要があります。
整数に変換するには、オプションの base
パラメータを持つ int()
コンストラクタを使用します。
binary_string = "101010"
binary_integer = int(binary_string, base=2)
print(binary_integer)
# Outputs: 42
結果の整数をバイナリ形式で出力したい場合は、F-string post で説明されている方法を使うことができます。
また、フォーマット指定子として接頭辞 0b
を付けるかどうかを決めることができます。
print(f'{binary_integer:#b}', f'{binary_integer:b}')
('0b101010', '101010')
1.4. 16進数
Python は独自の 16 進データ型をサポートしていません。 そのため、16進文字列を管理するには整数型に変換する必要があります。
整数に変換するには、オプションの base
パラメータを持つ int()
コンストラクタを使用します。
hexa_string = "14F0"
hexa_integer = int(hexa_string, base=16)
print(hexa_integer)
# Outputs: 5360
結果の整数を16進数で出力したい場合は、F-string post で説明されている方法を使うことができます。
また、書式指定子として接頭辞 0x
を付けるかどうかを決めることができます。
print(f'{hexa_integer:#x}', f'{hexa_integer:x}')
('0x14f0', '14f0')
2. コンテナ型
Pythonの組み込みコンテナ型であるリスト、タプル、セット、辞書も文字列から変換できます。 しかし、これらを数値のようにコンストラクタで変換しようとすると、以下のように期待とは異なる結果が得られます。
friends = "[Mark, Elon]"
friends_tuple = "(Mark, Elon)"
print(list(friends))
print(tuple(friends_tuple))
# Output:
# ['[', 'M', 'a', 'r', 'k', ',', ' ', 'E', 'l', 'o', 'n', ']']
# ('(', 'M', 'a', 'r', 'k', ',', ' ', 'E', 'l', 'o', 'n', ')')
そのため、これらのコンテナ型をパースする別の方法が必要です。
Python標準ライブラリの ast
モジュールが提供する literal_eval()
関数は、コンテナ型をパースして変換する便利な方法を提供します。
この関数は eval()
関数をハックしたものです。
2.1. リスト
文字列をリスト形式に変換するコードは以下のように書けます。
import ast
list_string = "['item1', 'item2', 'item3']"
my_list = ast.literal_eval(list_string)
print(my_list)
print(type(my_list))
# Output:
# ['item1', 'item2', 'item3']
# <class 'list'>
2.2. タプル
文字列をタプル形式に変換するコードは次のように書ける。
import ast
tuple_string = "('item1', 'item2', 'item3')"
my_tuple = ast.literal_eval(tuple_string)
print(my_tuple)
print(type(my_tuple))
# Output:
# ('item1', 'item2', 'item3')
# <class 'tuple'>
2.3. セット
文字列をセット形式で変換するコードは、以下のように記述できます。
import ast
set_string = "{'item1', 'item2', 'item3'}"
my_set = ast.literal_eval(set_string)
print(my_set)
print(type(my_set))
# Output:
# {'item3', 'item2', 'item1'}
# <class 'set'>
2.4. 辞書
文字列を辞書形式で変換するコードは、以下のように書くことができる。
import ast
dict_string = "{'key1': 'value1', 'key2': 'value2', 'key3': 'value3'}"
my_dict = ast.literal_eval(dict_string)
print(my_dict)
print(type(my_dict))
# Output:
# {'key1': 'value1', 'key2': 'value2', 'key3': 'value3'}
# <class 'dict'>
3. バイト文字列
バイト形式の文字列を bytes
データ型に変換するには、 str.encode()
メソッドを使用します。
byte_like_string = "b'Hello'"
actual_bytes = byte_like_string[2:-1].encode('utf-8')
print(actual_bytes) # Outputs: b'Hello'
print(type(actual_bytes)) # Outputs: <class 'bytes'>
これは Python でバイトを表現するための接頭辞を取り除き、encode()
メソッドの内容のみを変換します。
バイト型は type(){;py}
関数で確認できます。
4. 日付 時間
Python の文字列から日付と時刻の情報を取り出して読み込むには、 datetime
モジュールの strptime()
メソッドを使用します。
説明とサンプルコードは datetime - 3. 日付と時刻のフォーマットと解析 を参照してください。 を参照してください。
5. おわりに
これまで、Pythonの文字列を数値、コンテナ型、バイト型、日付と時刻など、いくつかの異なる型に変換する方法を見てきました。 文字列型はプログラムがユーザーと通信するための手段なので、よく理解して使うことが重要です。
