我有一個從MD模擬包生成座標的文件。從python和numpy文件解析座標
的格式如下:
(1.323232,1.22323,3.23123)
你也可以指定如下座標的輸出,沒有逗號:
(1.323232 1.22323 3.23123)
如何用python解析數組中的這樣一行。 具體如何刪除括號。 在C中,使用scanf很容易嗎?
我有一個從MD模擬包生成座標的文件。從python和numpy文件解析座標
的格式如下:
(1.323232,1.22323,3.23123)
你也可以指定如下座標的輸出,沒有逗號:
(1.323232 1.22323 3.23123)
如何用python解析數組中的這樣一行。 具體如何刪除括號。 在C中,使用scanf很容易嗎?
有兩種明顯的方法可以做到這一點:有或沒有正則表達式。既然你可能會得到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()]
我通常做一些像'.strip()。strip('()')'而不是'[1:-1]'。感覺比較安全.. – DSM
@DSM:但是你仍然在處理無效的行而沒有發表評論,甚至可能不正確,所以這種感覺只是一種錯覺。如果你想驗證輸入,你需要一個明確的檢查 - 可能只是'assert line.startswith('(')和line.endswith(')')'。 – abarnert
我經常遇到帶有不一致尾隨空格的文件 - 我有時懷疑是否有教程在某處推薦''\ n'.join(stuff)' - 所以你不會說服我做盲目的'[1: -1]'比明確移除邊界空白和括號更好。至少我知道我要刪除哪些角色,而且這些知識 - 儘管我同意它是無效的 - 避免了我經常遇到的一類錯誤。所以,可以感知的道不是真道,這只是虛幻的。 – DSM
你可以這樣做:
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)))
改變重新進入
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)))
您究竟如何用scanf解析帶有可選逗號的行? – abarnert
每行有多組座標,還是隻有一組? – brm
sscanf(line,「(%lf,%lf,%lf)」,&vx [i],&vy [i],&vz [i]); – Dimo