2017-04-12 26 views
1

私は、ファイルからのような試合の後readlineにしようとしています:読み取り

with open(jij, "a") as jout: 
    with open(jfile, "r") as jinp: 
    for line in jinp: 
     if line.strip().startswith("IQ"): 
     # for _ in line: 
     #for lines in jinp: 
     for lines in range(2500): 
      # lines = jinp.readline() 
      rows = jinp.readline().split() 
      print("{0:<3s}{1:<3s}{2:<3s}{3:<3s}{4:>3s}{5:>3s}{6:>3s}{7:>15s}{8:>7s}". 
       format(rows[3], rows[2], rows[0], rows[1], rows[4], rows[5], rows[6], rows[11], rows[10])) 

jfileは(私はgeneraly 1000行の周りに持っているが、それは偶数であり、非常に短いですより大きい):

    Isotropic exchange couplings Jij 

    number of sites NQ = 2 
    number of types NT = 2 
    site occupation: 
    1 1 1 1.000 
    2 1 2 1.000 
IQ IT JQ JT N1 N2 N3 DRX DRY DRZ  DR   J_ij [mRy]  J_ij [meV] 
1 1 2 2 -1 -1 -1 -0.500 -0.500 -0.681 0.982  0.159317355  2.167623834 
1 1 2 2 0 -1 -1 0.500 -0.500 -0.681 0.982  0.159317355  2.167623834 
1 1 2 2 -1 0 -1 -0.500 0.500 -0.681 0.982  0.159317355  2.167623834 
1 1 2 2 0 0 -1 0.500 0.500 -0.681 0.982  0.159317355  2.167623834 
1 1 2 2 -1 -1 0 -0.500 -0.500 0.681 0.982  0.159317355  2.167623834 
1 1 2 2 0 -1 0 0.500 -0.500 0.681 0.982  0.159317355  2.167623834 
1 1 2 2 -1 0 0 -0.500 0.500 0.681 0.982  0.159317355  2.167623834 
1 1 2 2 0 0 0 0.500 0.500 0.681 0.982  0.159317355  2.167623834 
1 1 1 1 0 -1 0 0.000 -1.000 0.000 1.000  1.457569899 19.831256008 
1 1 1 1 -1 0 0 -1.000 0.000 0.000 1.000  1.453728096 19.778985590 

「IQ」を見つけた後、リストとしていくつかの要素を印刷しようとしています。

私の好みの方法は、for _ in lineで行います。最初の100行のみを使用しています。 for lines in jinpは1行をスキップし、次の行を読み込みます。私はそれを範囲に入れているときに意図したとおりに動作しています。しかし、私は固定回線番号を入れたくありません。

for _ in lineはどうなりますか?

https://da.gd/CtKZは完全なファイルです。 for lines in range(2500)

https://da.gd/6cx3結果に

https://da.gd/7V8F結果for _ in line

https://da.gd/v9ts結果にfor lines in jinp

と期待される結果がrange(2500)からですが、私は行番号をハードコーディングしたくありません。あなたのすべてのソリューションは、このライン+別の方法の反復を持って

rows = jinp.readline().split()# This make the pointer point to next line 

# for _ in line: go over the chars in the line (100) 
#for lines in jinp: go over the open file - > so you read twice per iteration 

あなたはこの、短いとより読みやすいを使用することができ

+1

あなたの出力と希望の出力を投稿できますか? –

+0

@ t.m.adam:added – BaRud

+0

'for _ in line'は' len(line) 'が100であるので100行を出力します。 "IQ"の後に行を印刷する場合は、それらをリストに入れ、それを反復することができます –

答えて

0

あなたの問題は、uは同じFDを再利用しています。

flag = False 
with open(jij, "a") as jout: 
    with open(jfile, "r") as jinp: 
     for line in jinp: 
      if flag: 
       rows = line.split() 
       jout.write("{0:<3s}{1:<3s}{2:<3s}{3:<3s}{4:>3s}{5:>3s}{6:>3s}{7:>15s}{8:>7s}\n". 
          format(rows[3], rows[2], rows[0], rows[1], rows[4], rows[5], rows[6], rows[11], 
            rows[10])) 
      else: 
       flag = line.strip().startswith("IQ") 
関連する問題