使用python从XML字符串检测数据类型
我有一些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
<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的确切类型名称对您有好处的话,它将起作用。