我正在将文件读入python 2.4,其结构如下:
field1: 7
field2: "Hello, world!"
field3: 6.2
我们的想法是将其解析为一个字典,该字典以fieldfoo
为键,以冒号后面的值作为值。
我想将冒号后的内容转换为“实际”数据类型,即'7'
应转换为int
,"Hello, world!"
转换为字符串等。唯一需要解析的数据类型是整数,浮点数和字符串。 python标准库中是否有一个函数可以让人轻松进行这种转换?
我应该用它来解析这个问题,所以(至少在这种情况下)安全不是问题。
答案 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)
由于“只需要解析的数据类型是int
,float
和str
”,所以这样的事情对您有用:
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