2013-03-11 77 views
3

我有数百个字符串都有相同的格式 - 两个整数,后面跟着三个浮点数。一个例子:解析一个带有浮点数和整数的python字符串

1 10 1.2345 5.4321 10.5647 

我只是想把这些字符串一个接一个地解析成它们各自的整数和浮点数。我可以想到几种方法来做到这一点,但我希望python会有一些优雅的东西,这与str.format被用来写作的东西相反。这似乎是非常基本的功能,所以我很抱歉,如果我问的是已经回答的问题,但我无法在任何地方找到解决方案。有什么想法吗?谢谢。

+1

http://mattgemmell.com/2008/12/08 /你曾尝试过/ – XORcist 2013-03-11 21:07:50

+1

我的组织的防火墙阻止了该站点。 – 2013-03-11 21:09:39

+0

嘿,他们不希望你太努力,我猜?它开始于:“如果你是一名开发人员,并且你打算向另一个开发人员提出一个技术问题(在论坛上,通过电子邮件,在聊天频道或亲自面试),你最好准备回答这个问题“你有什么尝试?”“ – askewchan 2013-03-11 21:41:30

回答

2

我想你最好过的东西,如numpy的的genfromtxtloadtxt

import numpy as np 
import StringIO 

s = """1 10 1.2345 5.4321 10.5647 
     2 14 434.35 345.34 1000000 
     3 8 253.235 2.53 .002345""" 
f = StringIO.StringIO(s) 

data = np.genfromtxt(f, names = 'id, count, x, y, z', dtype=[int,int,float,float,float]) 

这给你的这些东西一个数组,所以第一行可以访问为

data[0] 
#(1, 10, 1.2345, 5.4321, 10.5647) 

或所有第二栏:

data['count'] 
#array([10, 14, 8]) 

顺便说一句,这将在浮动列整数转换成浮动,如果你的花车之一恰好是一个整数。

4

一个简单的列表理解应该做的伎俩

>>> mystr = '1 10 1.2345 5.4321 10.5647' 
>>> [int(s) if s.isdigit() else float(s) for s in mystr.split()] 
[1, 10, 1.2345, 5.4321, 10.5647] 
+2

这会将负整数转换为浮点数。可能这不会成为问题,但是ast.literal_eval会避免它。 – DSM 2013-03-11 21:16:54

1

你可以做这样的事情:

def linep(line): 
    line=line.split() 
    try: 
     ints=map(int, line[0:2]) 
     floats=map(float, line[2:5]) 
    except ValueError as e: 
     print e 
    return ints+floats 

print linep('1 10 1.2345 5.4321 10.5647') 

然后使用这种方式:

>>> s='''1 10 1.2345 5.4321 10.5647 
-2 11 -0.5 0.5 .3''' 
>>> for line in s.splitlines(): 
...  print linep(line) 

打印:

[1, 10, 1.2345, 5.4321, 10.5647] 
[-2, 11, -0.5, 0.5, 0.3] 
+0

谢谢。类似的东西是我的选择之一。不过,我希望有一些简短而又甜蜜的东西,就好像格式化的输出相反。 – 2013-03-11 21:55:06