【问题标题】:Validating a Data Type in Python在 Python 中验证数据类型
【发布时间】:2017-04-26 12:13:07
【问题描述】:

我正在提取一个带有键值对的数据文件,其中数据是原始的并且以字符串开头。我创建了这个函数来传递键值对的值来检查它是什么数据类型。

我创建了这个函数来标记该值并根据需要将其转换为适当的数据类型。

这是处理此问题的最佳方法,还是 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'

【问题讨论】:

  • 也许您正在寻找typeisinstance bif。
  • 你是在构建sql语句吗?
  • 我的最终目标是以原始字符串格式传递的数据,然后根据需要进行转换。我还将使用它通过算法创建具有适当数据类型的 create table 语句(这就是为什么您看到文本引用为 varchar)。

标签: python dataset


【解决方案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"

通过这种方式,您可以轻松添加解析器,从而可以解耦您的代码。

【讨论】:

  • 我刚刚对您的功能与我的功能进行了基准测试,您的功能在 28 秒内完成,而我的功能在 9 分 22 秒内执行相同的文件。谢谢!
【解决方案2】:

使用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

希望对你有所帮助。

【讨论】:

    【解决方案3】:

    如果你想要 Python 内置的东西(不需要模块),那么这可能会有一些用处。

    get_type = lambda value: str(type(value)).split("'")[1]
    

    这里发生的事情是,我们从内置类型函数中获取结果并将其转换为字符串,以便拆分它,以便我们可以返回从该函数返回的数据类型。

    以下是我从 Python 3 的一些测试中收集到的信息:

    >>> get_type(10)
    'int'
    >>> get_type('10')
    'str'
    >>> get_type(b'10')
    'bytes'
    >>> get_type(10.0)
    'float'
    >>> get_type(True)
    'bool'
    

    我希望我可以对此进行更详细的说明,但这恰好可以满足我的需求,因此希望这对其他人有用。

    【讨论】:

      【解决方案4】:

      如果您的代码等待一个一个输入,那么我的答案应该没问题。如果您必须分析一个数据集,那么这是完全不同的工作。

      请注意,这是一个不使用任何额外库的幼稚答案。 您还可以指定其他日期、时间和日期时间格式以满足您的要求。

      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))
      

      您可能需要对此进行测试,以确保没有特殊情况需要考虑。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-11-06
        • 2017-10-16
        • 2018-08-10
        • 1970-01-01
        • 2019-01-23
        • 2012-04-29
        • 1970-01-01
        相关资源
        最近更新 更多