2017-09-01 8 views
3

これは私の最初の質問です!Pythonで2行を別々に読む方法

私は、ファイルのようなラインの数百含まれています。オブジェクト

私が個別に各2本のラインを読みたい、各行は、対象、関係を表し

<car> <part_of> <machine>  
<motor> <part_of> <car>  

を、それらを処理し、出力2か入力ファイルに基づいて3行。 私はこのようなものでした:

opener = open('input.txt')  # to read even lines 
    opener2 = open('input.txt')  # to read odd lines 
    num = 2 
    for eachline in opener: 
     if num % 2 == 0: 
      line1 = opener.readline().split() 
      sub_line1, rel_line1, obj_line1 = line1[0],line1[1],line1[2] 
      sub_line1 = line1[0].lstrip("<").rstrip(">") 
      rel_line1 = line1[1].lstrip("<").rstrip(">") 
      obj_line1 = line1[2].lstrip("\"").rstrip("\"") 
     else: 
      line2 = opener2.readline().split() 
      sub_line2, rel_line2, obj_line2 = line1[0],line2[1],line2[2] 
      sub_line2 = line2[0].lstrip("<").rstrip(">") 
      rel_line2 = line2[1].lstrip("<").rstrip(">") 
      obj_line2 = line2[2].lstrip("\"").rstrip("\"") 
     num += 1 

を私は出力のためにこれをやった:

output1 = " ".join([sub_line1,rel_line1,obj_line1]) 
writer.write(output1+"\n") 
output2 = " ".join([sub_line2,rel_line2,obj_line2]) 
writer.write(output2+'\n') 
output3 = " ".join([sub_line1,relation,sub_line2]) 
writer.write(output3+'\n') 

注:出力3の入力には存在しません。私は前の2行を組み合わせてこれを追加しています。しかし、毎回奇数行が偶数行によって書き換えられます。どうすればそれらを分けることができますか?

サンプル出力:

<car> <part_of> <machine> 
<motor> <part_of> <car> 
<car> <part_of> <motor> 

各3行目は、前の2行に基づいて構成されています。

PART 2:

行が入力ファイルに存在する場合、それは私が処理しています2つのラインの一つとして、それを含めずに、そのまま「_」どのように私はちょうど出力することができますから始まりますか?この状態をどこに置くことができますか?

ありがとうございます!

+0

偶数ラインと奇数ラインの重要性は何ですか?あなたの例では、彼らは同じように見えます。 – Bemmu

答えて

2

あなたが唯一の奇数または偶数ラインを読むためにファイルディスクリプタ(openによって返されたもの)を取得することはできません。 ファイルの全内容を読み取る必要があります。

したがって、2つのファイル記述子を持つ必要はありません.1つのファイル記述子しか使用できません。 fileの代わりにenumerate(file)を反復処理できます。 あなたにラインを与える代わりに、それはあなたに(index, line)カップルを与えるでしょう。 for id, line in enumerate(file)を実行して解凍し、idの残りを2で確認し、それが奇数か偶数かを判断できます。

file = open(path, 'r') 
for id, line in enumerate(file): 
    if id % 2 == 0: 
     # The line is even 
    else: 
     # The line is odd 

公平にするために、あなたは、唯一の奇数または偶数ラインを読むためにファイル記述子を得ることができるという点で、あなただけの他のすべての行をスキップする可能性が...しかし、その後、なぜわざわざ1人がすでに仕事をしているときに2つのディスクリプタを作成するには?

1

イテレータを分離する必要がある理由は明確ではありません。ただ一度に2つのライン読み:

with open('input.txt') as fh: 
    while True: 
     line1 = fh.readline() 
     line2 = fh.readline() 
     if not line1: 
      break 
     ... 

をあなたは破るための条件は、ファイルが行の奇数を持っている場合などline1line2の両方が、空の場合は破るために変更することができます。

に何らかの理由で別のイテレータが必要な場合は、各イテレータを1行おきにスキップしてください。これは簡単にするためにitertoolsモジュールを使用します。

from itertools import tee, islice, izip 
with open('input.txt') as fh: 
    # Get two copies of the iterator. IMPORTANT: don't use fh 
    # anymore; only itr1 and itr2 
    itr1, itr2 = tee(fh) 

    itr1 = islice(itr1, 0, None, 2) # 0, 2, 4, ... 
    itr2 = islice(itr2, 1, None, 2) # 1, 3, 5, ... 

    for line1, line2 in izip(itr1, itr2): 
     ... 
+0

ありがとうございました。私はあなたの助けに感謝します。私はitertoolsを使わずに言ったようにしました。私はあなたを最初の方法で使いました。それから私は印刷します(ライン1)。それは空です。それは何も読んでいない。 – codeDojo

関連する問題