Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/298.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从XML字符串检测数据类型_Python_Sqlite - Fatal编程技术网

使用python从XML字符串检测数据类型

使用python从XML字符串检测数据类型,python,sqlite,Python,Sqlite,我有一些XML标记字符串,如下所示 <Processor>AMD Athlon(tm) 64 X2 Dual Core Processor 4400+ 2.31 GHz</Processor> <ClockSpeed>2.31</ClockSpeed> <NumberOfCores>2</NumberOfCores> <InstalledMemory>2.00</InstalledMemory> &l

我有一些XML标记字符串,如下所示

<Processor>AMD Athlon(tm) 64 X2 Dual Core Processor 4400+ 2.31 GHz</Processor>
<ClockSpeed>2.31</ClockSpeed>
<NumberOfCores>2</NumberOfCores>
<InstalledMemory>2.00</InstalledMemory>
<OperatingSystem>Windows 7 Professional</OperatingSystem>
AMD Athlon(tm)64 X2双核处理器4400+2.31 GHz
2.31
2.
2
Windows7专业版
如何使用python自动检测数据类型? 例如,“AMD Athlon(tm)64 X2双核处理器4400+2.31 GHz”->字符串、“2.31”->浮点等

我需要这个功能,因为我需要用XML数据创建SQLite表,比如

CREATE table ABC (Processor string, ClockSpeed float ... ) 创建表ABC(处理器字符串、时钟速度浮点…)
根据您期望的格式类型,您可以使用正则表达式来检测浮点和整数,然后假设无法解析为数字的任何内容都是字符串,如下所示:

import re

FLOAT_RE = re.compile(r'^(\d+\.\d*|\d*\.\d+)$')
INT_RE = re.compile(r'^\d+$')

# ... code to get xml value into a variable ...

if FLOAT_RE.match(xml_value):
    value_type = 'float'
elif INT_RE.match(xml_value):
    value_type = 'int'
else:
    value_type = 'string'

这只是一个非常基本的尝试-有更复杂的格式来表达数字是可能的;如果您认为您可能需要一些更复杂的格式,那么您必须扩展它,使其在所有情况下都能正常工作。

根据您需要的格式类型,您可以使用正则表达式来检测浮点和整数,然后假设无法解析为数字的任何内容都是字符串,如下所示:

import re

FLOAT_RE = re.compile(r'^(\d+\.\d*|\d*\.\d+)$')
INT_RE = re.compile(r'^\d+$')

# ... code to get xml value into a variable ...

if FLOAT_RE.match(xml_value):
    value_type = 'float'
elif INT_RE.match(xml_value):
    value_type = 'int'
else:
    value_type = 'string'

这只是一个非常基本的尝试-有更复杂的格式来表达数字是可能的;如果您认为可能需要一些更复杂的格式,那么您必须扩展它,使其在所有情况下都能正常工作。

BeautifulSoup是一个很好的HTML/XML解析器:

http://www.crummy.com/software/BeautifulSoup/

我不完全确定它是否可以在给定xsd/xsl的情况下按类型转换数据,但它可以检测编码,因此可能有一个开始。

BeautifulSoup是一个很好的HTML/XML解析器:

http://www.crummy.com/software/BeautifulSoup/

我不完全确定它是否可以根据给定的xsd/xsl类型转换数据,但它可以检测编码,因此可能有一个开始。

一种可能性是按精确顺序尝试各种类型,如果这些类型都不起作用,则默认为
str
。例如:

def what_type(s, possible_types=((int, [0]), (float, ()))):
    for t, xargs in possible_types:
        try: t(s, *xargs)
        except ValueError: pass
        else: return t
    return str

当然,当您想要使用与Python完全相同的语法约定时,这是特别可取的——例如,接受
'0x7e'
作为
int
以及
'126'
,等等。如果您需要不同的语法约定,那么您应该改为对字符串
s
执行解析,无论是通过REs还是通过其他方式。

一种可能是按照精确的顺序尝试各种类型,如果这些都不起作用,则默认为
str
。例如:

def what_type(s, possible_types=((int, [0]), (float, ()))):
    for t, xargs in possible_types:
        try: t(s, *xargs)
        except ValueError: pass
        else: return t
    return str

当然,当您想要使用与Python完全相同的语法约定时,这是特别可取的——例如,接受
'0x7e'
作为
int
以及
'126'
,等等。如果需要不同的语法约定,则应改为通过REs或其他方式对字符串
s
执行解析。

如何返回“int”,而不是?在
可能的\u types
数组中的元组中添加第三个值,该数组是该类型的字符串表示形式;然后将for循环修改为
for t,xargs,stype:
,然后
返回stype
@Amber的建议很好,也很一般,但是
返回t.。\uuu name\uuuu
如果Python的确切类型名称对您有好处,那么它将起作用。我如何返回“int”,而不是?向
可能的\u类型
数组中的元组添加第三个值,该数组是该类型的字符串表示形式;然后将for循环修改为
for t,xargs,stype:
,然后
返回stype
@Amber的建议很好,也很一般,但是
返回t.。\uuu name\uuuu
如果Python的确切类型名称对您有好处的话,它将起作用。