使用python和numpy解析文件中的坐标
我有一个从MD模拟软件包生成的坐标文件 格式如下: (1.323232、1.22323、3.23123) 也可以按如下方式指定坐标的输出,不带逗号: (1.323232 1.22323 3.23123) 如何用python解析数组中的这样一行。 具体来说,如何删除括号。使用python和numpy解析文件中的坐标,python,numpy,plot,Python,Numpy,Plot,我有一个从MD模拟软件包生成的坐标文件 格式如下: (1.323232、1.22323、3.23123) 也可以按如下方式指定坐标的输出,不带逗号: (1.323232 1.22323 3.23123) 如何用python解析数组中的这样一行。 具体来说,如何删除括号。 在C语言中,使用scanf很容易做到这一点?有两种明显的方法:使用或不使用regexp。因为您可能会得到300个regexp答案,所以让我们来演示如何在没有 我们要去掉paren,然后在空格或逗号后跟空格上拆分。另一种说法是:去
在C语言中,使用scanf很容易做到这一点?有两种明显的方法:使用或不使用regexp。因为您可能会得到300个regexp答案,所以让我们来演示如何在没有 我们要去掉paren,然后在空格或逗号后跟空格上拆分。另一种说法是:去掉paren,然后在空格上拆分,然后去掉可选的尾随逗号。例如:
line = line[1:-1] # strip the parens
bits = line.split() # split on whitespace
bits = [bit.rstrip(',') for bit in bits] # strip trailing commas
bits = map(float, bits) # convert to float
当然,您可以将这些内容合并到一行:
bits = [float(bit.rstrip(',')) for bit in line[1:-1].split()]
您可以这样做:
txt=['(1.323232, 1.22323, 3.23123)',
'(1.32.3232, 1.22323, 3.23123)',
'(1.323232 1.22323 3.23123)']
data=[]
for i, s in enumerate(txt):
st=s.strip().lstrip('(').rstrip(')')
if ',' in s:
res=[e.strip() for e in st.split(',')]
else:
res=st.split()
try:
res=map(float, res)
except ValueError:
print 'Element {} "{}" is invalid'.format(i,s)
continue
data.append(res)
print 'data:', data
印刷品:
Element 1 "(1.32.3232, 1.22323, 3.23123)" is invalid
data: [[1.323232, 1.22323, 3.23123], [1.323232, 1.22323, 3.23123]]
我本来打算写一些类似于其他答案的东西,但是,为了完整起见,我将是正则表达式的家伙
import re
f = open('myfile', 'r')
r = re.compile(r'\-*\d+\.*\d+')
data =[]
for line in f:
data.append(map(float, r.findall(line)))
将re更改为
r'\-*\d+\.*\d*'
还将捕获单个数字,例如(1、2、3)
如何准确地用scanf解析带有可选逗号的线?每条线有多组坐标,还是只有一组?sscanf(线,(%lf,%lf),&vx[i]、&vy[i]、&vz[i]);我的意思是不要为这件事感到抱歉confusion@Dimo你试过了吗?如果给它一行不带逗号的话,它将返回
1
,并保持vy[i]
和vz[i]
不变。我通常做一些类似.strip().strip('()')
的事情,而不是[1:-1]
。感觉更安全了。@DSM:但是你仍然在处理无效的行而没有注释,可能更不正确,所以这种感觉只是一种错觉。如果你想验证输入,你需要一个显式的检查,可能只是断言line.startswith(“(”)和line.endswith(“)”)
。我经常遇到尾随空格不一致的文件——有时我想知道是否有教程推荐“\n”。加入(stuff)
——所以你不会让我相信,盲法[1:-1]
比显式删除边界空白和括号要好。至少我知道我要删除哪些字符,而且这些知识——尽管我同意这是不合法的——避免了我经常遇到的一类bug。因此,从某种意义上说,可以感知的道并不是真正的道,这只是一种幻觉。@DSM:去掉尾随空格是一个独立的问题,与去掉括号是完全独立的。您可以执行line.rstrip()[1:-1]
。您可以执行line.strip(“()”)
。同时,您曾经用strip(“()”)
捕获过哪些您用[1:-1]
无法捕获的bug?
import re
f = open('myfile', 'r')
r = re.compile(r'\-*\d+\.*\d*')
data =[]
for line in f:
data.append(map(float, r.findall(line)))