2017-12-13 7 views
3

Textfile1が重複しているそのうちのいくつかの単語、含まれていますPythonのワードカウント機能していない

電車

21street

電車

などを。

私は出現回数を数え、これをTextfile2に書き込む必要があります。また、アルファベット順に、私はsortedを持っているのです。

列車2

21street 1

...というように:最終Textfile2がどのように見えるかの例。ここで

は私の試みです:

file1=open(textfile1,"r") 
list1=[] 

for line in file1: 
    list1.append(line) 

import collections 

counter=collections.Counter(list1) #not sure how I can use this in my program 

list2=list(set(list1)) 

list3=sorted(list2) 

file2=open(textfile2,"w") 

for i in list3: 

    file2.write(i+count((i)in list1)) 

ワードカウントが動作するようには思えない、と私はそれを解決するかどうかはわかりません。ご協力ありがとうございました。

答えて

3

エラーから始めて、少しずつ変更してみましょう。

file2.write(i+count((i)in list1)) 
#    ^^^^^^^^^^^^^^^^^^ 
# NameError: name 'count' is not defined 

問題は、カウントに誤ってアクセスしていることです。 Counterは、dictのように動作します。キーは何がカウントされ、値はカウント(int)です。あなたはので、他の理由でエラーを与えるであろう、このように変更し、ラインiのカウントにアクセスするには、あなたのCounter名前counterを与えた:、我々は成功した回数を取得しているにもかかわらず

file2.write(i+counter[i]) 
#    ^^^^^^^^^^ 
# TypeError: must be str, not int 

を私たちがすることはできませんこのように行に追加してください。i行と数は2種類あります。 1つはテキスト(str)で、もう1つは数字(int)です。その数字をテキスト表現に変える必要があります。それがあなたを混乱させる場合は、2 + 2 == 4のように考えると、"2" + "2" == "22"です。

file2.write(i+str(counter[i])) 

これ以上のエラーが、あなたがテストしているかに応じて、ファイルが空のままであるかもしれないfile2としてオープン:ここでそれを行う方法です。変更が完了すると、変更はディスクに書き込まれます。そのことを決して忘れないために、withステートメントを使用して、簿記をPythonに任せることができます。インデントされたブロックの最後では、ファイルは自動的に閉じられます。以下は、いくつかのより多くの完全なコードが変更にコメントされています

21street 
1Train 
2 

数は次の行に終わる:それを実行した後

# imports at the top 
import collections 

list1=[] 
with open(textfile1,"r") as file1: 
    for line in file1: 
     list1.append(line) 
# file1 automatically closed here 
counter=collections.Counter(list1) 
list2=list(set(list1)) 
list3=sorted(list2) 
with open(textfile2,"w") as file2: 
    # i implies index which it isn't; let's call it line too 
    for line in list3: 
     file2.write(line+str(counter[line])) 
# file2 automatically closed here 

file2は、次のようになりますように、ファイルが開かれました。この理由は、リストに保存された行が"21street""Train"ではなく、"21street\n""Train\n"であることにあります。末尾の"\n"は行区切り文字としての改行文字です。それ以降のテキストを追加すると、新しい行に終わります。これがポイントです。 listでは、このようなセパレータはもはや必要ないので、のは、それを削除してみましょう:

 list1.append(line.rstrip("\n")) 
     #    ^^^^^^^^^^^^^ 

今、あなたの出力は次のようになりウィル:

あなたが右に、バックセパレータを追加する必要があり
21street1Train2 

ファイルに再度書き込むときに、場所を指定します。正しい場所は何ですか?行の終わりに。また、ライン間のスペースとカウントがいいだろう:必要に応じて

 file2.write(line+" "+str(counter[line])+"\n") 
     #    ^^^^     ^^^^^ 

は最後に、出力は次のようになります。

21street 1 
Train 2 
+0

!どうもありがとうございました! :) – Jaakkath

+0

@Jaakkath私は本質的に焦点を当て、より教育的な答えを書き直しました。 :) –

0

私のソリューションは、次のようになります。

with open('a.txt') as f: 
    a = f.read() 
a = a.split('\n') 
a = [i for i in a if i != ''] 
from collections import Counter 
b = Counter(a) 
with open('b.txt', 'w') as f: 
    for key in b: 
     f.write('{} : {}\n'.format(key, b[key])) 
+0

確かにそれを短くする方法はありますが、OPは初心者だと考えてください。すでに完璧に変わったことを変えて、あまりにも混乱させてはいけません。 –

+0

私は同意します。 OPに、より冗長な答えに従ってください。私はちょうどそれが他の人々に役立つかもしれないことを希望でここに保っています:) – mamun

0

の代わりにlistdictを試す必要があります。外部モジュールをインポートする必要はありません。これは、ロジックを使って行うことができます。

012 NEW_TEXTファイル内
track={} 
with open("file.txt",'r') as f: 
    for line in f: 

     if line!='\n': 

      if line.strip() not in track: 
       track[line.strip()]=1 
      else: 
       track[line.strip()]+=1 


with open("new_text",'w') as new: 
    for key,value in track.items(): 
     tr="{} {} \n".format(key,value) 
     new.write(tr) 

出力:

Train 2 
21street 1 
完璧に動作
関連する問題