4

文字列内のデータ型を推測してみたいと思います。

シナリオ:
データの行を含むCSVファイルがあり、このデータをデータベースに保存したいと思います。
すべてのフィールドを文字列として保存したくありません。
CSVのフィールドは変更される可能性があるため、タイプについては何も推測できません。

例(CSVファイル):

[Row 1 - column names] --> "name", "age" , "children"
[Row 2 - data row    ] --> "John", "45.5", "3"
...
[Row n - data row    ] --> ...

nameこの場合、行のデータを見て、それが文字列の列でageあり、浮動小数点数childrenの列であり、整数の列であると推測したいと思います。

私の試み:
最も簡単なアプローチは、変換を試行し、特定の変換が成功したときにタイプを決定することです。
私はこの目的のために次のようなメソッドを作成しました。

def deduceType(str):
    try:
        #first try to convert to int:
        int(str)
        return 0 #integer
    except ValueError:
        try:
            #not integer, try float:
            float(str)
            return 1 #float
        except ValueError:
            #not float, so deduct string
            return 2 #string

私の質問:
問題は、より多くのデータ型(ブール値、long型、符号なし数値型など)を推測できるようにしたい場合、このアプローチは煩雑で不正確になることです。

これを行うためのよりきちんとした、より効率的で厳密な方法はありますか?

回答(編集):
Martijn Pietersの回答に基づいて、私はこれを行っています:

def deduceType(str):
    try:
        return type(ast.literal_eval(str))
    except ValueError:
        return type('') #string
4

1 に答える 1

9

値に使用ast.literal_eval()します。Pythonリテラルとして解釈されます。それが失敗した場合は、代わりに文字列があります。

>>> import ast
>>> ast.literal_eval("45.5")
45.5
>>> ast.literal_eval("3")
3
>>> ast.literal_eval("John")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/opt/local/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/ast.py", line 68, in literal_eval
    return _convert(node_or_string)
  File "/opt/local/Library/Frameworks/Python.framework/Versions/2.6/lib/python2.6/ast.py", line 67, in _convert
    raise ValueError('malformed string')
ValueError: malformed string
于 2012-11-27T10:29:32.893 に答える