2013-10-30 55 views
1

我有一個從MD模擬包生成座標的文件。從python和numpy文件解析座標

的格式如下:

(1.323232,1.22323,3.23123)

你也可以指定如下座標的輸出,沒有逗號:

(1.323232 1.22323 3.23123)

如何用python解析數組中的這樣一行。 具體如何刪除括號。 在C中,使用scanf很容易嗎?

+0

您究竟如何用scanf解析帶有可選逗號的行? – abarnert

+0

每行有多組座標,還是隻有一組? – brm

+0

sscanf(line,「(%lf,%lf,%lf)」,&vx [i],&vy [i],&vz [i]); – Dimo

回答

1

有兩種明顯的方法可以做到這一點:有或沒有正則表達式。既然你可能會得到300個正則表達式的答案,讓我們來演示如何去做。

我們想要去除parens,然後分割空白或逗號後跟空格。另一種說法是:去除零件,然後分割空白,然後去掉可選的尾隨逗號。例如:

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()] 
+1

我通常做一些像'.strip()。strip('()')'而不是'[1:-1]'。感覺比較安全.. – DSM

+0

@DSM:但是你仍然在處理無效的行而沒有發表評論,甚至可能不正確,所以這種感覺只是一種錯覺。如果你想驗證輸入,你需要一個明確的檢查 - 可能只是'assert line.startswith('(')和line.endswith(')')'。 – abarnert

+1

我經常遇到帶有不一致尾隨空格的文件 - 我有時懷疑是否有教程在某處推薦''\ n'.join(stuff)' - 所以你不會說服我做盲目的'[1: -1]'比明確移除邊界空白和括號更好。至少我知道我要刪除哪些角色,而且這些知識 - 儘管我同意它是無效的 - 避免了我經常遇到的一類錯誤。所以,可以感知的道不是真道,這只是虛幻的。 – DSM

1

你可以這樣做:

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]] 
1

我會寫一些類似其他答案的東西,但是,爲了完整,我會是正則表達式的傢伙

import re 
f = open('myfile', 'r') 
r = re.compile(r'\-*\d+\.*\d+') 
data =[] 
for line in f: 
    data.append(map(float, r.findall(line))) 
0

改變重新進入

r'\-*\d+\.*\d*' 

也捕獲單個數字如(1,2,3)

import re 
f = open('myfile', 'r') 
r = re.compile(r'\-*\d+\.*\d*') 
data =[] 
for line in f: 
    data.append(map(float, r.findall(line)))