2017-02-22 6 views
2

2つのファイルがあります.1つは入力データで、もう1つは結果を格納します。ファイル内のすべての情報は一列に並んでいます。プログラムはファイル内の重複する行を探し、繰り返さない行だけを出力する必要があります。ここで入力されたデータの例です。ここでファイル内の反復行を削除する方法:python

apple 
apple 
apple 
apple 
banana 
bargain 
brick 
brick 
sample 
sample 
simple 
text 
text 
text 

は、出力ファイルの例です。ここで

apple 
banana 
bargain 
brick 
sample 
simple 
text 

は私のコードは次のとおりです。

fileFrom = open ('data.txt', 'r') 
fileTo = open ('result.txt', 'w') 

line = fileFrom.readline() 

while line != '': 
    line = line.rstrip('\n') 
    if line == fileFrom.readline(): 
     line = fileFrom.readline() 
    else: 
     fileTo.write(line + '\n') 
    line = fileFrom.readline() 

fileFrom.close() 
fileTo.close() 

何らかの理由で、このプログラムは、ちょうど入力ファイルを再印刷します。 私のインストラクターは、配列やリストとして構造体を使用しないように指示していますので、単に行を比較するだけです。

+0

'list'(または' dict'または 'set'?)を使うことができない場合は、既に見た行をどのように保存するのですか? –

+1

私が理解しているように、filename.readLine()だけを使うことができるので、どうやら2つの隣接する行を比較する必要があります。これは私の考えです。 – lili

+0

主な質問は、私の "if"ステートメントは常にFalseなので、プログラムは常に "else"に行くので隣りの行を比較する方法です – lili

答えて

2

'if'比較と 'if'の比較のために、あなたの読み込み行がコード内で何度も何回も表示されます。それだけではなく、各行を取り除き、最初の行が削除されたときと比較するだけです。

with open ('data.txt', 'r') as fileFrom: 
    with open ('result.txt', 'w') as fileTo: 
     line = fileFrom.readline() 
     while line != '': 
      line = line.rstrip('\n') 
      line2 = fileFrom.readline().rstrip('\n'); 
      while(line==line2): 
       line2 = fileFrom.readline().rstrip('\n'); 
      fileTo.write(line +'\n') 
      line = line2 
0

まず、各ライン、ストリップ不要な文字を反復して設定し、それを追加し、だから、唯一のユニークな価値があるだろう、あなたはユニークな値で設定したら、ファイルに書き込むことができます。

あなたは、あなたが、それらが一致することはありませんしていないと、すべての行が書き込まれます改行やその他を取り除いてきましたそのうちの一つの2行を比較し、次のコード

fileFrom = open ('data.txt', 'r') 
fileTo = open ('result.txt', 'w') 


def readFile(): 
    lines=set() 
    with open('data.txt') as f: 
     for line in f: 
      lines.add(line.strip()) 
     return lines 

def writeToFile(lines): 
    for line in lines: 
     fileTo.write(line + '\n') 

lines=readFile() 
print lines 
if lines: 
    writeToFile(lines) 
2

を使用することができます。

line = line.rstrip('\n')   # stripped 
    if line == fileFrom.readline(): # compare stripped to non-stripped 

また、あまりにも多くのreadline操作を実行しています。最初はループ内の3行があまりにも頻繁に行を読んでいて、いくつかの行を比較するのを逃すかもしれないように見えます。 for inループを使用してファイルを繰り返し処理するほうがはるかに簡単です。

修正するには両方ともrstrip pedです。最後の行に改行がないので、取り除かれた文字列を比較する必要があります。

with open ('data.txt', 'r') as fileFrom: 
    with open ('result.txt', 'w') as fileTo: 
     last = '' 
     for line in fileFrom: 
      if line.rstrip() != last.rstrip(): 
       fileTo.write(line) 
       last = line 

問題の制約を受けて、このソリューションは、すべての重複が後続の行にまとめられている場合にのみ重複する行を選びます。

0

正規表現を使用できますか?

import re 
file1 = open("inputrep","r").read() 
file2 = open("output.txt","w") 
file2.write(re.sub(r"(\w+\n)\1+",r"\1",file1)) 
file2.close() 
1
if line == fileFrom.readline(): 
     line = fileFrom.readline() 

あなたが呼んでいる「fileFrom.readline()」メソッド各行につき2回:あなたは、印刷のために、各項目を一度にこれを試すことができます。そのため、コードが正しく動作しません。

このコードを使用できます。

fileFrom = open("data.txt", "r") 
fileTo = open("result.txt", "w") 
unique_lines = set() 
for line in fileFrom.readlines(): 
    line = line.rstrip('\n') 
    if line not in unique_lines: # check the duplicate lines 
     fileTo.write(line+'\n') 
     unique_lines.add(line) 
fileTo.close() 
関連する問題