印刷シェブロン(>>
)任意のファイルオブジェクトに出力をリダイレクトし構文:
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]
ありがとう –