Python

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

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

    コチラもオススメ

    KRSW

    駆け出し機械学習エンジニア。機械学習、DB、WEBと浅く広い感じ。 Junior machine learning engineer. Not a specialist but a generalist who knows DB, WEB too.

    役に立ったらシェアしてくれると励みになります。

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

    -Python

    Translate »

    Copyright© ITips , 2020 All Rights Reserved.