我正在使用键值对来提取数据文件,其中数据是原始的并以字符串形式开始。我创建了这个函数来传递键值对的值来检查它是什么数据类型。
我创建了这个函数来标记该值并根据需要将其转换为适当的数据类型。
这是处理此问题的最佳方法吗,或者python中是否已包含更快或更高效的库或函数?
import dateparser
def dataType(value):
try:
int(value)
return 'INTEGER'
except ValueError:
try:
float(value)
return 'DOUBLE'
except ValueError:
try:
if value and value[0].isdigit():
dateparser.parse(value, settings={'STRICT_PARSING': True})
return 'DATETIME'
else:
return 'VARCHAR'
except ValueError:
return 'VARCHAR'
答案 0 :(得分:1)
你云做的事情如下:
import re
from collections import OrderedDict
import datetime
register_type = OrderedDict()
register_type["INTEGER"] = {"handle":int, "args": [], "kw": {}}
register_type["DOUBLE"] = {"handle":float, "args": [], "kw": {}}
register_type["DATE"] = {"handle":lambda x: datetime.datetime.strptime(x, "%Y-%m-%d"), "args": [], "kw": {}}
register_type["ALPHA"] = {"handle":lambda x: re.match("\w+", x), "args": [], "kw": {}}
def get_type(value):
type_ = "UNKNOWN"
for k, v in register_type.items():
try:
parsed = v["handle"](value, *v["args"], **v["kw"])
type_ = k
break
except ValueError as E:
continue
return type_
# print(get_type("2017-01-26"))
# "DATE"
# print(get_type("ali"))
# "alpha"
# print(get_type("10"))
# "INTEGER"
# print(get_type("10.0"))
# "DOUBLE"
通过这种方式,您可以轻松添加解析器,从而可以解耦代码。
答案 1 :(得分:1)
使用arrow
库轻松检测datetime
类型。
我得到@thefourtheye's answer的启发,使用literal_eval
将任何数据转换为相应的type
。
然后我使用地图转换所需的文字字符串找到的type
。
from ast import literal_eval
import arrow
map_type_to_string = {int: 'INTEGER',
bool: 'BOOLEAN',
str: 'VARCHAR',
float: 'DOUBLE',
arrow.arrow.Arrow: 'DATETIME'}
def get_type(input_data):
try:
return map_type_to_string[type(literal_eval(input_data))]
except (ValueError, SyntaxError):
try:
return map_type_to_string[type(arrow.get(input_data))]
except (arrow.parser.ParserError, ValueError):
return map_type_to_string[str]
print(get_type("1")) # INTEGER
print(get_type("1.2354")) # DOUBLE
print(get_type("True")) # BOOLEAN
print(get_type("2002-12-25 00:00:00-06:39")) # DATETIME
print(get_type("abcd")) # VARCHAR
希望它有所帮助。
答案 2 :(得分:1)
如果你想要内置于Python的东西(不需要模块),那么这可能会有所帮助。
>>> get_type(10)
'int'
>>> get_type('10')
'str'
>>> get_type(b'10')
'bytes'
>>> get_type(10.0)
'float'
>>> get_type(True)
'bool'
这里发生的是我们从内置类型函数中获取结果并将其转换为字符串以便将其拆分,以便我们可以返回从该函数报告的数据类型。 / p>
以下是我从Python 3中的一些测试中收集到的内容:
file_get_contents
我希望我能详细了解这个问题,但这恰好符合我的需要,所以希望这对其他人有用。
答案 3 :(得分:0)
如果您的代码等待输入逐个输入,那么我的答案应该没问题。如果你必须分析一个数据集,那就完全不同了。
请注意这是一个天真的答案,不使用任何额外的库。 您还可以指定其他日期,时间和日期时间格式以符合您的要求。
from re import match
# Does not consider that 0 and 1 can be used to describe a BOOLEAN SQL value
# Use True, true and FALSE, false to describe SQL BOOLEAN values
PY_2_SQL_TYPE_PATTERNS = (
((r'^TRUE|true|FALSE|false$', ), 'BOOLEAN'),
((r'^\d+$', ), 'INTEGER'),
((r'^\d+\.\d+$', ), 'DOUBLE'),
((r'^\d{4}/\d{2}/\d{2}$', ), 'DATE'),
((r'^\d{2}:\d{2}:\d{2}.\d{1,5}$', ), 'TIME'),
((r'^\d{4}/\d{2}/\d{2} \d{2}:\d{2}:\d{2}.\d{1,5}$', ), 'DATETIME'),
((r'.*', ), 'VARCHAR'), # Falls back to VARCHAR as .* will match anything
)
def get_sql_type(value):
'''
Find the corresponding SQL TYPE according to value
:param value: A value typed by the user
:return: The corresponding SQL TYPE from PY_2_SQL_TYPE_PATTERNS as a string
'''
for patterns, sql_type in PY_2_SQL_TYPE_PATTERNS:
for p in patterns:
if match(p, value):
return sql_type
v = input('Type a value: ').strip()
print(get_sql_type(v))
您可能需要对此进行测试,以确保没有特殊情况需要考虑。