如何使用python确定字符串对象是否为整数,双精度,布尔值,日期或字符串?

时间:2016-03-19 00:50:55

标签: python string object types

我想要一个可以确定某个输入是否属于以下类别之一的函数

  • 整数
  • 布尔
  • 日期
  • 字符串

这是我目前拥有的功能,但挑战在于,如果输入是一个字符串,我希望该函数仍然可以确定它是日期,整数,双精度,布尔值,还是串

def text_type_determine(i):
    if type(i) == int:
        return 'integer'
    elif type(i) == float:
        return 'double'
    elif type(i) == bool:
        return 'boolean'
    elif type(i) == str:
        return 'string'

例如,我希望以下输入产生相关结果:

  • ' 2015年1月1日' - > '日期'
  • ' 1' - > '整数'
  • ' 1.0' - > '双'
  • '真' - > '布尔'
  • '随机字符串' - >串

4 个答案:

答案 0 :(得分:0)

您可以像这样使用eval

def text_type_determine(i):
    i = eval(i)
    if type(i) == int:
        return 'integer'
    elif type(i) == float:
        return 'double'
    elif type(i) == bool:
        return 'boolean'
    elif type(i) == str:
        return 'string'

所以这个:

print(text_type_determine("12.3"))

输出:

double

答案 1 :(得分:0)

您可以使用try / catch指令测试转换为(仅用于int ):

def isInt(s):
    try: 
        int(s)
        return True
     except ValueError:
        return False

def text_type_determine(s):
    if isInt(s):
        return 'integer'

答案 2 :(得分:0)

您可以尝试按逻辑顺序将每个项目转换为各种类型并处理每个案例:

from datetime import datetime

def text_type_determine(i):
    # datetime is the most specific, so start with it
    try:
        datetime.strftime(i, '%Y-%m-%d')
        return 'date'
    except:
        # Next try int before float since float(`4`) will work
        try:
            int(i)
            return 'integer'
        except:
            try:
                # Python uses float not double, but I think it should do
                float(i)
                return 'double'
            except:
                pass
    # Finally if all our number cases fail, check if
    # we have a boolean, otherwise it's just a string
    if i in ['true', 'false']:
        return 'boolean'
    return 'string'

这当然假设日期只是YYYY-MM-DD格式,并且所有布尔值都是truefalse。添加更多选项应该非常简单。

答案 3 :(得分:0)

我不知道你的日期是什么意思,因为它没有出现在你自己的代码中,但如果你想评估潜在的整数,浮点数是字符串等......你可以使用ast.literal_eval

from ast import literal_eval

def text_type_determine(i):
    types = {int: 'integer', float: 'double', bool: 'boolean', str: 'string'}
    try:
        return types.get(type(literal_eval(i)))
    except ValueError:
        return types.get(type(i))

如果您想测试对象是否可以解析为日期,您可以使用dateutil之类的内容:

from dateutil import parser
from datetime import datetime

def text_type_determine(i):
    types = {int: 'integer', float: 'double', bool: 'boolean', str: 'string', datetime: "date"}
    for tpe in [literal_eval, parser.parse]:
        try:
            return types.get(type(tpe(i)))
        except (AttributeError, ValueError):
            pass
    return types.get(type(i))

哪个会给你:

In [17]: text_type_determine(1)
Out[17]: 'integer'

In [18]: text_type_determine(datetime.now())
Out[18]: 'date'

In [19]: text_type_determine("2016-03-19")
Out[19]: 'date'

In [20]: text_type_determine("2016")
Out[20]: 'integer'

In [21]: text_type_determine("2016.23")
Out[21]: 'double'

您可能希望重新排列检查顺序,因为dateutil.parser可能会给您一些意外的输出。如果您的日期总是以相同的顺序,那么只需使用datetime.strptime进行解析,如果不是用strptime尝试每个可能的日期变化,那么dateutil将是一个更好的解决方案。