Python

Pythonで文字列で書かれた配列をlistとして認識する方法

うーん
どしたの?
Pythonの外部からPythonにデータを渡したんだけど
[1,2,3] みたいな配列形式で渡したつもりなのにPythonがlistとして認識してくれなくて・・・
あー、あるある
文字列として認識しちゃってる系ですね
そうなんだよ
どうしたらいい?
じゃあ解決方法を紹介しますねー


Pythonはあまり型を意識せずに記述できて便利だが、場合によってはデータを意図した型として取り込んでくれないことがある。

そのような場合は大体文字列(String)型として取り込まれている。
数字にしたいだけであれば int() でcastすればいいが、配列(list)や辞書型(dict)として認識させたい場合は同じように処理はできない。

ではどうすればいいのか。

今回はそんな問題を解決するために「Pythonで文字列で書かれた配列をlistとして認識する方法」について解説する。

この記事を書いている人


システムエンジニア、AIエンジニアと、IT業界で10年以上働いている中堅。PythonとSQLが得意。最近は画像も扱い始めた。

記事を読むメリット

  • 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() だが危険な一面もある。

    任意の文字列を式として評価できるということは、任意のコードを実行できることに他ならない。


    どういうこと?
    例えばWEBシステムに入力欄があるとします
    ふむふむ
    WEBシステムで入力された文字列に eval() が適用されるのを知ってたとします
    ふむふむ
    「よっしゃ、サーバーの秘密データ全部printしたろ!」
    あっかーん!
    ね。危険でしょ?
    めっちゃ危険だわ。。。


    eval()任意のコマンドを実行できてしまうセキュリティホールでもある。

    自分だけの閉じた環境で使うプログラムであれば問題無いが、不特定の人間が自由に入力できる文字列に対して eval() を実行するような仕組みにしてしまうと悪意のあるコードを実行されてしまうので eval() は使わないほうが良い。



    Pythonで文字列で書かれた配列をlistとして認識する方法 まとめ

    文字列 [1,2,3] を配列(list)として認識するには eval() を使うと良い。

    しかし eval() は任意のコマンドを実行できてしまうセキュリティホールなので、 eval() の引数として自由に入力できる文字列を使うのは避けよう


    まぁこの辺はPythonに限らずphpでも同じですね
    なんか後半はPythonの話というよりはWEBセキュリティの話みたくなってたような・・・




    他にも「PythonのWEBフレームワークの導入方法」「PythonでExcelデータを読み込む方法」についての記事など色々なPython記事もあるので、もし気になったら見てみてほしい。

    ITipsと同じようなブログを作る方法

    ブログに興味がありますか?

    もしブログに興味がある場合は↓このページ↓を参考にすれば、ITipsと同じ構成でブログを作ることができます

    サーバー、ドメイン、ASPと【ブログに必要なものは全て】このページに書きました。
    同じ構成でブログ作るのはいいけど、記事はマネしないでネ (TДT;)

    ランキング参加中

    にほんブログ村 IT技術ブログへ

    他にもブログやSNSで紹介してくれると励みになります。

    はてブのコメントで酷評されると泣きます(´;ω;`)

    -Python

    © 2022 ITips