Eya*_*lAr 4 python type-conversion
我想尝试推断字符串中的数据类型.
场景:
我有一个包含数据行的CSV文件,我想将这些数据存储在数据库中.
我不想将所有字段存储为字符串.
由于CSV中的字段可能会发生变化,因此我无法假设其类型.
示例(CSV文件):
[Row 1 - column names] --> "name", "age" , "children"
[Row 2 - data row ] --> "John", "45.5", "3"
...
[Row n - data row ] --> ...
Run Code Online (Sandbox Code Playgroud)
在这种情况下,通过查看行中的数据,我想推断出这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
Run Code Online (Sandbox Code Playgroud)
我的问题:
问题是,如果我想能够推断出更多的数据类型(布尔值,长整数,无符号数字类型等),那么这种方法变得麻烦且不准确.
这样做有更整洁,更有效和更严格的方法吗?
回答(编辑):
根据Martijn Pieters的回答,我这样做:
def deduceType(str):
try:
return type(ast.literal_eval(str))
except ValueError:
return type('') #string
Run Code Online (Sandbox Code Playgroud)
使用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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
421 次 |
| 最近记录: |