




[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記事もあるので、もし気になったら見てみてほしい。




