Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Python中验证数据类型_Python_Dataset - Fatal编程技术网

在Python中验证数据类型

在Python中验证数据类型,python,dataset,Python,Dataset,我拉入一个带有键值对的数据文件,其中数据是原始的,以字符串开头。我创建这个函数是为了传递键值对的值来检查它是什么数据类型 我创建此函数是为了标记该值,并根据需要将其转换为适当的数据类型 这是处理此问题的最佳方法,还是python中已经包含了一个更快或更高效的库或函数 import dateparser def dataType(value): try: int(value) return 'INTEGER' except ValueError:

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

我创建此函数是为了标记该值,并根据需要将其转换为适当的数据类型

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

您可以执行以下操作:

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"
通过这种方式,您可以轻松地添加解析器,从而可以解耦代码

使用库轻松检测
datetime
类型

通过使用将任何数据转换为适当的
类型
,我得到了更多的灵感

然后,我使用一个映射来转换由所需的文本字符串找到的
类型

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

希望能有所帮助。

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

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

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

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

如果您需要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'

我希望我能更详细地了解这一点,但这恰好满足了我的需要,所以希望这对其他人有用。

也许你正在寻找
类型
isinstance
bif。你是否试图构建sql语句?我的最终目标是获取以原始字符串格式传递的数据,然后根据需要转换它。我还将使用它通过算法创建具有适当数据类型的create table语句(这就是为什么您会看到被引用为varchar的文本)。我刚刚对您的函数进行了基准测试,与我的函数相比,您的函数在28秒内完成了任务,而我的函数在9分22秒内执行了相同的文件。谢谢