2017-08-22 14 views
0

テキストファイル10-10-1CNT_pot.pot_fmtから特定のデータを読み込もうとしています。必要なデータはa,bおよびcであり、この場合はfft coefficients(25,300,300)です。現在、これらを読むために私が考えることができる唯一の方法は、テキストファイル内での彼らの位置からです。しかし、私はこれが嫌いですが、テキストファイルが少し変更された場合はバグが発生しやすくなります。誰かが別の方法を提案することはできますか?特定のデータをテキストファイルから読み取る

以下の例のテキストファイル(とバギーコード)を参照してください:

BEGIN header 

     Real Lattice(A)    Lattice parameters(A) Cell Angles 
    2.4675850 0.0000000 0.0000000  a = 2.467585 alpha = 90.000000 
    0.0000000 30.0000000 0.0000000  b = 30.000000 beta = 90.000000 
    0.0000000 0.0000000 30.0000000  c = 30.000000 gamma = 90.000000 

1       ! nspins 
25 300 300    ! fine FFT grid along <a,b,c> 
END header: data is "<a b c> pot" in units of Hartrees 

コード:

file = open("10-10-1CNT_pot.pot_fmt", 'r') 
lines = file.readlines() 
file.close() 


parts = lines[3].split() 
a = parts[5] 

parts1 = lines[4].split() 
b = parts1[5] 

parts2 = lines[5].split() 
c = parts2[5] 

parts3 = lines[8].split() 
width = parts3[0] 

parts4 = lines[8].split() 
height = parts4[1] 

parts5 = lines[8].split() 
depth = parts5[2] 
+0

読み込み(a、b、c)値だけが必要ですか? –

+0

はい、文字列 "!fine FFT grid に沿って"の前に表示される3つの整数 –

+0

これまでに何をしていますか?あなたのコードを投稿してください。 –

答えて

2

そんなに正規表現を使用する必要があります。

import re 


s="" 

with open('your_file_name','r') as myfile: 
a = myfile.readlines() 

for i in a: 
s +=i 

list1=list() 

list2=list() 



list1.append(re.findall('(a = .*) alpha | (b = .*) beta | (c = .*) gamma', s ,re.M)) 



list2.append(re.findall('(.*) !',s)) 
for i in list2: 

print i[1] 

for i in list1 : 
for j in i: 
    print j[0],j[1],j[2] 

出力:

25 300 300  

a = 2.467585 
b = 30.000000 
    c = 30.000000 
+1

この結果が必要ですか?私も私のソリューションを編集することができます任意のバグを言う –

+0

ありがとう!私の1つの問題は、ファイル内の数字が変化するため、sに格納されている文字列が変更されることです。これは問題を引き起こすでしょうか? –

+1

OK私のコードを編集する –

関連する問題