2016-11-21 2 views
0

I는 다음과 같이 반복적으로 약 3000 블록을 갖는 파일 (두 제 도시)을 가지고여러 좌표로 파일을 읽고 별도의 배열에 저장하는 방법은 무엇입니까?

좌표의 각각의 세트는 (이 경우에는 21) 원자의 수에 의해 분리된다
21 
Profile. 1 HEAT OF FORMATION = -79.392 KCAL = -332.175 KJ 
    H  -2.22728  -1.35263  1.32579 
    H  1.21425  -1.35263  1.32579 
    C  1.43878  0.44129  1.32579 
    O  2.25748  -0.52202  1.23773 
    C  0.12570  -0.10907  1.38542 
    H  -0.47394  0.10034  2.26424 
    C  -2.02530  -1.28825  -2.05204 
    C  -0.80697  -0.63466  -2.22403 
    H  -0.41632  -0.42983  -3.21532 
    H  0.84731  0.28355  -1.21782 
    C  -0.09866  -0.24043  -1.09182 
    C  -1.83256  -1.15779  0.32994 
    C  -0.59706  -0.50055  0.19091 
    H  -3.51151  -2.06378  -0.69513 
    C  -2.55421  -1.55647  -0.78456 
    O  -2.78665  -1.71220  -3.09841 
    H  -2.37922  -1.48635  -3.96745 
    H  2.21062  3.22762  2.75985 
    C  1.91952  1.85374  1.37731 
    O  2.22890  2.54529  0.44919 
    O  1.92486  2.27899  2.65936 
    21 
Profile. 2 HEAT OF FORMATION = -79.390 KCAL = -332.168 KJ 
    H  -2.22728  -1.35263  1.32579 
    H  1.21674  -1.35282  1.32529 
    C  1.43862  0.44132  1.32582 
    O  2.25745  -0.52214  1.23772 
    C  0.12565  -0.10889  1.38540 
    H  -0.47402  0.10051  2.26417 
    C  -2.02530  -1.28825  -2.05204 
    C  -0.80697  -0.63465  -2.22403 
    H  -0.41632  -0.42983  -3.21531 
    H  0.84730  0.28355  -1.21782 
    C  -0.09865  -0.24043  -1.09182 
    C  -1.83256  -1.15780  0.32995 
    C  -0.59702  -0.50058  0.19094 
    H  -3.51151  -2.06378  -0.69513 
    C  -2.55421  -1.55647  -0.78456 
    O  -2.78666  -1.71220  -3.09841 
    H  -2.37922  -1.48635  -3.96745 
    H  2.21061  3.22763  2.75985 
    C  1.91953  1.85373  1.37732 
    O  2.22890  2.54528  0.44919 
    O  1.92486  2.27898  2.65936 

및 형성의 열 .

궁극적으로 이러한 배열의 특정 요소를 조작 할 수 있도록 각 좌표 세트를 별도의 배열에 읽고 쓰는 방법에 대해 궁금합니다. 내가 코멘트에서 제안한 것처럼

+0

'np.genfromtxt'는 그 행을 공급할 모든 항목의 입력을 허용합니다. 간단한 시작은 모든 라인을리스트로 읽어들이는 것입니다 ('readlines'); 리스트를 블럭들로 나눈 다음, 그것들을 개별적으로'genfromtxt'에 넘겨주고, 각 블럭을위한 별도의 배열을 얻습니다. – hpaulj

답변

1

:

모든 라인을 읽어

In [783]: with open('stack40730696.txt','rb') as f: 
    ...:  lines = f.readlines() 

가 나는 등 라인으로 라인, 블록으로 블록을 읽을 수 있습니다. 하지만 목록으로 재생하는 것이 가장 쉽습니다.

이제 첫 번째 블록을 읽습니다. '21'의 데이터 라인의 수이다 같습니다

In [784]: i=0 
In [785]: n=int(lines[i]) 
In [786]: n 
Out[786]: 21 
In [787]: i+=1 
In [788]: block=lines[i:i+1+n] # grab the lines of a block, with header 
In [789]: block[0] 
Out[789]: b'Profile. 1 HEAT OF FORMATION = -79.392 KCAL = -332.175 KJ\n' 
In [790]: block[-1] 
Out[790]: b' O  1.92486  2.27899  2.65936\n' 

지금 genfromtxt와 배열로로드; 결과를 확인하십시오. 나는 모든 것을 인쇄했으나, 여기에서는 몇 가지 세부 사항 만 인쇄 할 것이다.

In [791]: data1=np.genfromtxt(block, skip_header=1,dtype=None) 
In [792]: data1.shape 
Out[792]: (21,) 
In [793]: data1.dtype 
Out[793]: dtype([('f0', 'S1'), ('f1', '<f8'), ('f2', '<f8'), ('f3', '<f8')]) 

다음 블록으로 이동하고 반복하십시오. 물론 전체 파일에 대해 이것을 루프에 넣고 목록에 data 배열을 수집하십시오.

In [794]: i=i+1+n 
In [795]: n=int(lines[i]) 
In [796]: i+=1 
In [797]: block=lines[i:i+1+n] 
In [798]: data2=np.genfromtxt(block, skip_header=1,dtype=None) 
In [799]: data2.shape 
Out[799]: (21,) 
In [800]: data2.dtype 
Out[800]: dtype([('f0', 'S1'), ('f1', '<f8'), ('f2', '<f8'), ('f3', '<f8')]) 

몇 가지 기록

In [802]: data2[:3] 
Out[802]: 
array([(b'H', -2.22728, -1.35263, 1.32579), 
     (b'H', 1.21674, -1.35282, 1.32529), 
     (b'C', 1.43862, 0.44132, 1.32582)], 
     dtype=[('f0', 'S1'), ('f1', '<f8'), ('f2', '<f8'), ('f3', '<f8')]) 

이 하나 개의 문자열 필드로 구조화 된 배열이며, 3 개 플로트 것. 이것은 문자열 배열과 (21,3) float 배열로 나눌 수 있습니다.

In [803]: dataf=np.genfromtxt(block, skip_header=1,usecols=[1,2,3]) 
In [804]: dataf.shape 
Out[804]: (21, 3) 
In [805]: dataf.dtype 
Out[805]: dtype('float64') 
+0

내 코드를 루프로 다시 작성하는 것은 기본적인 Python 프로그래밍이어야한다. 첫 번째 시도는 줄이 끊어지면 중단하면서 'while'이되지만 'for'일 수도 있습니다. 'for i in range (0, len (lines), 22) :' – hpaulj

관련 문제