在Python中将字符串解释为其他数据类型

时间:2012-01-31 00:30:05

标签: python string parsing python-2.4

我正在将文件读入python 2.4,其结构如下:

field1: 7
field2: "Hello, world!"
field3: 6.2

我们的想法是将其解析为一个字典,该字典以fieldfoo为键,以冒号后面的值作为值。

我想将冒号后的内容转换为“实际”数据类型,即'7'应转换为int"Hello, world!"转换为字符串等。唯一需要解析的数据类型是整数,浮点数和字符串。 python标准库中是否有一个函数可以让人轻松进行这种转换?

我应该用它来解析这个问题,所以(至少在这种情况下)安全不是问题。

7 个答案:

答案 0 :(得分:6)

首先将您的输入解析为fieldN: some_string对等列表。您可以使用re模块轻松完成此操作,或者甚至可以更简单地使用索引line.strip().find(': ')的左右切片。然后在值some_string上使用文字eval:

>>> import ast
>>> ast.literal_eval('6.2')
6.2
>>> type(_)
<type 'float'>
>>> ast.literal_eval('"Hello, world!"')
'Hello, world!'
>>> type(_)
<type 'str'>
>>> ast.literal_eval('7')
7
>>> type(_)
<type 'int'>

答案 1 :(得分:2)

对于较旧的python版本,例如被问到的版本,可以使用eval函数,但是,对于 reduce 邪恶,dict应该是全局命名空间用作第二个参数以避免函数调用。

>>> [eval(i, {"__builtins__":None}) for i in ['6.2', '"Hello, world!"', '7']]
[6.2, 'Hello, world!', 7]

答案 2 :(得分:2)

您可以尝试使用内置函数int将其转换为int()。如果字符串不能解释为int,则会引发ValueError异常。然后,您可以尝试使用float转换为float()。如果失败也只返回初始字符串

def interpret(val):
    try:
        return int(val)
    except ValueError:
        try:
            return float(val)
        except ValueError:
            return val

答案 3 :(得分:1)

由于“只需要解析的数据类型是intfloatstr,所以这样的事情对您有用:

entries = {'field1': '7', 'field2': "Hello, world!", 'field3': '6.2'}

for k,v in entries.items():
    if v.isdecimal():
        conv = int(v)
    else:
        try:
            conv = float(v)
        except ValueError:
            conv = v
    entries[k] = conv

print(entries)
# {'field2': 'Hello, world!', 'field3': 6.2, 'field1': 7}

答案 4 :(得分:0)

希望这有助于做你想做的事情:

#!/usr/bin/python

a = {'field1': 7}
b = {'field2': "Hello, world!"}
c = {'field3': 6.2}

temp1 = type(a['field1'])
temp2 = type(b['field2'])
temp3 = type(c['field3'])

print temp1
print temp2
print temp3

答案 5 :(得分:0)

感谢wim帮助我找出我需要搜索的内容。

可以使用eval()

>>> a=eval("7")
>>> b=eval("3")
>>> a+b
10
>>> b=eval("7.2")
>>> a=eval("3.5")
>>> a+b
10.699999999999999
>>> a=eval('"Hello, "')
>>> b=eval('"world!"')
>>> a+b
'Hello, world!'

答案 6 :(得分:0)

strconv lib。

In [22]: import strconv
/home/tworec/.local/lib/python2.7/site-packages/strconv.py:200: UserWarning: python-dateutil is not installed. As of version 0.5, this will be a hard dependency of strconv fordatetime parsing. Without it, only a limited set of datetime formats are supported without timezones.
  warnings.warn('python-dateutil is not installed. As of version 0.5, '

In [23]: strconv.convert('1.2')
Out[23]: 1.2

In [24]: type(strconv.convert('1.2'))
Out[24]: float

In [25]: type(strconv.convert('12'))
Out[25]: int

In [26]: type(strconv.convert('true'))
Out[26]: bool

In [27]: type(strconv.convert('tRue'))
Out[27]: bool

In [28]: type(strconv.convert('12 Jan'))
Out[28]: str

In [29]: type(strconv.convert('12 Jan 2018'))
Out[29]: str

In [30]: type(strconv.convert('2018-01-01'))
Out[30]: datetime.date