ast(Abstract Syntax Tree):抽象構文木
前回、matplotlibで途中で分断された(切れている)グラフを出力する方法を紹介しました。
今回は文字列を適切な型に変換してくれるast.literal_eval()をいじっていきます。
この「ast.literal_eval()」は標準ライブラリであるastモジュールに含まれています。
astとはAbstract Syntax Tree、抽象構文木といい、文字列から意味のある情報を取り出し、まとめる方法とのことです。
「ast.literal_eval()」を使うと、文字列を解釈し、数値(int型やfloat型)、リスト型や辞書型、タプル型などに変換してくれます。
テキストファイルやCSVファイルなど文字列のファイルを読み出す時に便利なので、その使い方を学ぶためにも色々といじってみました。
使い方はastモジュールをインポートして「ast.literal_eval(文字列)」とすると適切な型に変換された値が出力されます。
それでは始めていきましょう。
文字列→数値(int型、float型)
最初は文字列を数値(int型、float型)に変換してみましょう。
import ast
str1 = '1'
str1_ast = ast.literal_eval(str1)
print(str1_ast)
print(type(str1_ast))
実行結果
1
<class 'int'>
import ast
str1 = '1.2345'
str1_ast = ast.literal_eval(str1)
print(str1_ast)
print(type(str1_ast))
実行結果
1.2345
<class 'float'>
何の苦もなく変換することができました。
文字列→リスト型
次に文字列をリスト型に変換してみます。
この場合、文字列はリスト型を示す「[](角括弧)」でくくられている必要があります。
import ast
str3 = '[1, 2, 3]'
str3_ast = ast.literal_eval(str2)
print(str3_ast)
print(type(str3_ast))
print(str3_ast[1])
print(type(str3_ast[1]))
実行結果
[1, 2, 3]
<class 'list'>
2
<class 'int'>
リストに変換でき、さらにその要素もint型に変換されています。
要素が文字列の場合はどうでしょうか。
import ast
str4 = '["a", "b", "c"]'
str4_ast = ast.literal_eval(str4)
print(str4_ast)
print(type(str4_ast))
print(str4_ast[1])
print(type(str4_ast[1]))
実行結果
['a', 'b', 'c']
<class 'list'>
b
<class 'str'>
要素が文字列(str型)の場合でも、ちゃんとstr型として認識されています。
文字列→タプル型
次に文字列をタプル型に変換してみます。
タプル型の場合はその文字列が「()(括弧)」でくくられている必要があります。
import ast
str5 = '(1, 2, 3)'
str5_ast = ast.literal_eval(str5)
print(str5_ast)
print(type(str5_ast))
print(str5_ast[1])
print(type(str5_ast[1]))
実行結果
(1, 2, 3)
<class 'tuple'>
2
<class 'int'>
文字列→辞書型
次に文字列を辞書型に変換してみます。
辞書型の場合は文字列が「{“キー1”:要素1, “キー2”:要素2…}」となっている必要があります。
import ast
str6 = '{"a":1, "b":2, "c":3}'
str6_ast = ast.literal_eval(str6)
print(str6_ast)
print(type(str6_ast))
print(str6_ast["b"])
print(type(str6_ast["b"]))
実行結果
{'a': 1, 'b': 2, 'c': 3}
<class 'dict'>
2
<class 'int'>
辞書型もちゃんと解釈でき、キーでの要素取得もできています。
ごちゃ混ぜの場合
ここまでの例ではそれぞれの要素の型は同じにしてありました。
それでは例えば一つのリスト内に異なる型の要素が入っている場合、それぞれをちゃんと解釈できるのか試してみましょう。
import ast
str7 = '[1, "b", True]'
str7_ast = ast.literal_eval(str7)
print(str7_ast)
print(type(str7_ast))
print(str7_ast[0])
print(type(str7_ast[0]))
print(str7_ast[1])
print(type(str7_ast[1]))
print(str7_ast[2])
print(type(str7_ast[2]))
実行結果
[1, 'b', True]
<class 'list'>
1
<class 'int'>
b
<class 'str'>
True
<class 'bool'>
全ての要素がそれぞれの正しい型に変換できています。
ちなみに最後にbool型(True/False)も含めてありましたが、こちらも問題なく解釈できています。
最初にもお話ししましたが、ファイル操作をすると文字列でデータが取得される場合も多いので、ast.literal_eval()を使って解釈させると楽かもしれません。
次回は並列処理concurrent.futures ThreadPoolExecutorで複数の処理を実行した際、その終了を合わせる方法を紹介します。
ではでは今回はこんな感じで。
コメント