2016-08-03 14 views
0

これは、私がPythonで行を削除するために使用しているコードなので、 "cleanse"という名前です。私は数千語の単語とその品詞のリストを持っています:Python:ラインオーバーライグの問題?

NN by

PP at

PP at

...これは問題です。何らかの理由で(私が理解することができず、数時間試している)、私が単語の入力を通過するために使用しているプログラムは、重複を取り除いていないので、次にできることは、前者!ファイルを順番に調べ、実行時に重複を削除してください。しかし、私が行うたびに、このコードはリストの最後の行を取り、を複製します。何十万回も繰り返します。

考えてください。 :

EDIT:cleanseArchive()はwords.txtというファイルを通り、重複する行を取り除いて削除します.Pythonは行を削除することができないので、私は持っていません私は基本的には重複していないデータをリスト(saveList)に保存し、そのリストから各ファイルを新しいファイルに書き込む(古いものを削除する)ことに変わりました。それだけで何千回もの際に元のリストの何千もの最終的なオブジェクトを繰り返し、言っ

はEDIT2:これは私がこれまでのところ、回答からの提案を取ってきたものである:

def cleanseArchive(): 
    f = open("words.txt", "r+") 
    given_line = f.readlines() 
    f.seek(0) 
    saveList = set(given_line) 
    f.close() 
    os.remove("words.txt") 
    f = open("words.txt", "a") 
    f.write(saveList) 

しかし、ATMは、私にこのエラーを与えている:

Traceback (most recent call last): 
    File "C:\Python33\Scripts\AI\prototypal_intelligence.py", line 154, in <module> 
    initialize() 
    File "C:\Python33\Scripts\AI\prototypal_intelligence.py", line 100, in initialize 
    cleanseArchive() 
    File "C:\Python33\Scripts\AI\prototypal_intelligence.py", line 29, in cleanseArchive 
    f.write(saveList) 
TypeError: must be str, not set 
+1

問題は何ですか? cleanseArchiveは何をすべきですか?入力と出力の例を教えてください。 –

+1

リストから 'set'を作成するのはなぜですか?(定義によって重複はありません)、' set'の内容をファイルに書きますか? – Matthias

+0

もう1つ: 'if line [3:]!= n'の' line [3:] 'と' n'はどうして同じになるのですか? – Matthias

答えて

1
for i in saveList: 
    f.write(n+"\n") 

あなたは基本的に何度もnの値を印刷します。

この試してみてください:あなただけの "重複行" を削除したい場合は、私はあなたの読書のコードを変更した

for i in saveList: 
    f.write(i+"\n") 
+0

これと同じ問題は、「Notepad ++で開くには大きすぎる」と言われています。 1.62ギガビットほどかそれ以上。何が起きてる? –

+0

@Matthiasが提案したものを試して、それをセットに変換してください。 'save_list =セット(given_line)'あなたの編集のために – Aruj

+0

、 あなたはまだSAVELISTに私のために '使用する必要があります。 f.write(I + "\ n" は)'。 – Aruj

0

を:

saveList = [] 
duplicates = [] 
with open("words.txt", "r") as ins: 
for line in ins: 
    if line not in duplicates: 
     duplicates.append(line) 
     saveList.append(line) 

はさらに、上記補正を取ります!

0
def cleanseArchive(): 
f = open("words.txt", "r+") 
f.seek(0) 
given_line = f.readlines() 
saveList = set() 
for x,y in enumerate(given_line): 
    t=(y) 
    saveList.add(t) 
f.close() 
os.remove("words.txt") 
f = open("words.txt", "a") 
for i in saveList: f.write(i) 

完成品!私は列挙し、本質的にそれを使用して文字列を取得することに終わった。 Pythonは、あなたがセット/リストに入るときに、不機嫌な道をいくつか持っています。非常にあいまいな理由のために働かないほどのもの!どんな場合でも、それを修正しました。

+0

あなたは言う:「あまりにも多くのものはあまりあいまいな理由で働いていない!本当の理由は、あなたが何をやっているのかわからないからです。私は、あなたが「列挙する」と思うものは分からないが、ここでは必要ない。 – Matthias

0

さんがあなたのアップデートで私たちを与えたこのコードをクリーンアップしてみましょう:

def cleanseArchive(): 
    f = open("words.txt", "r+") 
    given_line = f.readlines() 
    f.seek(0) 
    saveList = set(given_line) 
    f.close() 
    os.remove("words.txt") 
    f = open("words.txt", "a") 
    f.write(saveList) 

我々はStyle Guide for Python Codeを尊重していない悪い名前を持って、私たちは余分コードの部分を持って、我々はのフルパワーを使用していませんPythonとその一部が動作していません。

不要なコードを削除しながら、意味のある名前を使用して始めましょう。

def cleanse_archive(): 
    infile = open("words.txt", "r") 
    given_lines = infile.readlines() 
    words = set(given_lines) 
    infile.close() 
    outfile = open("words.txt", "w") 
    outfile.write(words) 

seekが必要とされなかった、読むためにファイルを開くためのモードは今ちょうどrで、書き込み用のモードは今wであり、それがとにかく上書きされますので、我々は、ファイルの削除を落としました。これを見て、わかりやすいコードを作成しました。書いた後にファイルを閉じることができませんでした。 with文でファイルを開くと、Pythonがそれを処理します。 TypeError: must be str, not set

def cleanse_archive(): 
    with open("words.txt", "r") as infile: 
     words = set(infile.readlines()) 
    with open("words.txt", "w") as outfile: 
     outfile.write(words) 

は、今、私たちは私たちがoutfile.writeが呼び出されたときに発生するエラーメッセージを扱うでしょう明確なコードを持っていること。このメッセージはクリアです。ファイルに直接セットを書き込むことはできません。明らかに、セットの内容をループする必要があります。

def cleanse_archive(): 
    with open("words.txt", "r") as infile: 
     words = set(infile.readlines()) 
    with open("words.txt", "w") as outfile: 
     for word in words: 
      outfile.write(word) 

これだけです。