2016-05-25 2 views
1

IDを持つ行のシリーズのようなファイルを見て:こんにちは私はPythonで必要なものを出力しますが、私はそれが新しいファイルにその結果を書きたいのですがそのコードを持っている

aaaa 
aass 
asdd 
adfg 
aaaa 

私は思います新しいファイルにIDとその出現を古いファイルの形式で取得するようにしてください:

aaaa 2 
asdd 1 
aass 1 
adfg 1 

2つの要素をタブで区切ってください。

私は私が望むものを印刷していますが、新しいファイルに書き込みませんコード:あなたがPythonの2を使用すると、出力をファイルにあなたのコンソール出力を変換する最も簡単な方法は、使用している

with open("Only1ID.txt", "r") as file: 
    file = [item.lower().replace("\n", "") for item in file.readlines()] 
     for item in sorted(set(file)): 
      print item.title(), file.count(item) 

答えて

1

印刷シェブロン(>>)任意のファイルオブジェクトに出力をリダイレクトし構文:

with open("filename", "w") as f: # open a file in write mode 
    print >> f, "some data"  # print 'into the file' 

あなたのコードは、単に出力ファイルを開き、追加するための別のopenを追加した後、このようになります。あなたのprintステートメントにシェブロンをINGの:

with open("Only1ID.txt", "r") as file, open("output.txt", "w") as out_file: 
    file = [item.lower().replace("\n", "") for item in file.readlines()] 
    for item in sorted(set(file)): 
     print >> out_file item.title(), file.count(item) 

は、しかし、あなたのコードが1にすべきではないか、改善することができ、いくつかの他の多かれ少なかれ悪い事があります。

  • すると、同じ変数を使用しないでくださいファイルopenによって返されたオブジェクトと文字列のあなたの処理されたリストの両方にfile名前を付けます。これは紛らわしく、2つの異なる名前を使用するだけです。

  • あなたは直接文字列としてファイルの行を返す発電機のように動作し、ファイルオブジェクトを、反復処理することができます。ジェネレータは、次の行が必要な時はいつでも、それは、最初file.readlines()のようなあなたのメモリにファイル全体をロードし、その後、それらを処理しますが、一度に1行を読み込み、保存しないことを意味し、時間だけで次の要素のための要求を処理します。そうすれば、コードのパフォーマンスとリソース効率が向上します。

  • リストの理解を書くが、その結果をリストとして必ずしも必要としない場合は、forループを使用して繰り返し処理する必要があるため、ジェネレータ式を使用する方が効率的ですオブジェクトのラインジェネレータ)。リスト理解とジェネレータ表現の構文上の違いは括弧のみです。 (...)[...]を交換して、あなたは発電機を持っています。発電機の唯一の欠点は、あなたがその長さを見つけることができませんどちらもということで、また、あなたは直接インデックスを使用してアイテムにアクセスすることができます。これらの機能は必要ありませんので、ここでジェネレータは問題ありません。

  • 行から末尾の改行文字を削除する方が簡単です:line.rstrip()は末尾の空白をすべて削除します。たとえば、あなたが保持したい場合。スペース、改行だけを削除したい、引数としてその文字を渡す:line.rstrip("\n")

    しかし、print呼び出しの間に別の暗黙的な改行を追加しないで、後で再追加するのではなく、最初に呼び出しを取り除くほうが簡単で簡単です。迅速かつ容易である、コレクション内の要素の出現をカウントするタイプCounterあり

    print >> out_file item.title(), file.count(item), 
    
  • :あなたは、単に文の末尾にカンマを追加することによって、Pythonの2のprintの改行を抑制しますすべての要素に対して追加のcount()コールを必要としないので、自分で書くよりも簡単です。 Counterは、ほとんどの場合、アイテムをキーとして使用し、その数を値として持つ辞書のように動作します。単にcollectionsモジュールからそれをインポートして、このようにそれを使用します(改行を削除していないものを除く)のすべてのこれらの提案で

    from collections import Counter 
    c = Counter(lines) 
    for item in c: 
        print item, c[item] 
    

適用と変数をより明確なものに名前を変更、最適化されましたコードは次のようになります。

from collections import Counter 
with open("Only1ID.txt") as in_file, open("output.txt", "w") as out_file: 
    counter = Counter(line.lower().rstrip("\n") for line in in_file) 
    for item in sorted(counter): 
     print >> out_file item.title(), counter[item] 
+0

ありがとう –

関連する問題

 関連する問題