Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用python和numpy解析文件中的坐标_Python_Numpy_Plot - Fatal编程技术网

使用python和numpy解析文件中的坐标

使用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,然后在空格或逗号后跟空格上拆分。另一种说法是:去

我有一个从MD模拟软件包生成的坐标文件

格式如下:

(1.323232、1.22323、3.23123)

也可以按如下方式指定坐标的输出,不带逗号:

(1.323232 1.22323 3.23123)

如何用python解析数组中的这样一行。 具体来说,如何删除括号。
在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)))