[1,2,3]
みたいな配列形式で渡したつもりなのにPythonがlistとして認識してくれなくて・・・Pythonはあまり型を意識せずに記述できて便利だが、場合によってはデータを意図した型として取り込んでくれないことがある。
そのような場合は大体文字列(String)型として取り込まれている。
数字にしたいだけであれば int()
でcastすればいいが、配列(list)や辞書型(dict)として認識させたい場合は同じように処理はできない。
ではどうすればいいのか。
今回はそんな問題を解決するために「Pythonで文字列で書かれた配列をlistとして認識する方法」について解説する。
この記事を書いている人
記事を読むメリット
Pythonで文字列で書かれた配列をlistとして認識する方法
Pythonで文字列で書かれた配列をlistとして認識するには eval()
を用いる。
eval()
は入力された引数を式として評価する関数だ。
例えば文字列 "1+2+3"
はそのままprintすると "1+2+3"
がそのまま表示されるが、eval()
を使うと文字列の中身を式として評価するので計算結果nの 6
を返してくれる。
print("1+2+3") # 1+2+3 a = eval("1+2+3") print(a) # 6
同じことを文字で書かれた配列にも適用できる。
string_list = "[1,2,3,4,5]" print("string_list[0]:{}".format(string_list[0])) print(type(string_list[0])) # string_list[0]:[ # <class 'str'> eval_list = eval(string_list) print("eval_list[0]:{}".format(eval_list[0])) print(type(eval_list[0])) # eval_list[0]:1 # <class 'int'>
この例だと "[1,2,3,4,5]"
はそのままだと文字列なので0番目の要素は "[" となる。
しかし eval()
で評価すれば配列(list)として認識するので0番目の要素としては 1
を返してくれる。
辞書型(dict)でも同様に処理できる。
string_dict = '{"a":1,"b":2,"c":"xxx"}' print('string_dict["a"]:{}'.format(string_dict["a"])) # TypeError: string indices must be integers eval_dict = eval(string_dict) print('eval_dict["a"]:{}'.format(eval_dict["a"])) # eval_dict["a"]:1
'{"a":1,"b":2,"c":"xxx"}'
はそのままだと文字列なので"a"というキーでアクセスするとエラーになる。
しかし eval()
で評価すれば辞書型(dict)として認識するのでキー"a"の値としては 1
を返してくれる。
脆弱性に注意
一見便利な eval()
だが危険な一面もある。
任意の文字列を式として評価できるということは、任意のコードを実行できることに他ならない。
eval()
が適用されるのを知ってたとしますeval()
は任意のコマンドを実行できてしまうセキュリティホールでもある。
自分だけの閉じた環境で使うプログラムであれば問題無いが、不特定の人間が自由に入力できる文字列に対して eval()
を実行するような仕組みにしてしまうと悪意のあるコードを実行されてしまうので eval()
は使わないほうが良い。
Pythonで文字列で書かれた配列をlistとして認識する方法 まとめ
文字列 [1,2,3]
を配列(list)として認識するには eval()
を使うと良い。
しかし eval()
は任意のコマンドを実行できてしまうセキュリティホールなので、 eval()
の引数として自由に入力できる文字列を使うのは避けよう。
他にも「PythonのWEBフレームワークの導入方法」や「PythonでExcelデータを読み込む方法」についての記事など色々なPython記事もあるので、もし気になったら見てみてほしい。