2016-10-18 6 views
0

ファイル内に最後のK行を見つけるためのテールを作成するという割り当てがあります。これに使用するバッファが用意されています。今のところ、小さなものを書いて、ファイル内に"\n"の文字を検索しようとしています。私はいくつかの問題にぶつかっています。 pythonで私のコードは、とpython3には、を吹き飛ばします。しかし、テキストファイルにはこれ以上の利点があります。誰かが私が望むようにこれがなぜ機能していないのか教えてもらえますか?私がやりたい何テキストファイル内に改行文字を見つける

def new(): 
    try: 
     f = open("test.txt", "r") 
     count = 0 
     for i in f: 
      if i == "\n": 
       count = count + 1 
     return count 
     f.close() 
    except(FileNotFoundError): 
     print("No file")  

は使用がファイルに後方に行くと、すべてがそう頻繁に改行文字を検索しますが、これはも私のために動作していないように努めています。

+1

for i in fは、ファイル内の行を繰り返します。文字は使用しません。 – sytech

+0

@Gator_Pythonありがとうございます。私はforループがファイル内の各文字を繰り返し処理すると考えました。ありがとうございました。 –

答えて

1

for i in f:あなたが考えていることはしていません。ファイルのデフォルトイテレータは、ではなく、linesとなります。だから、あなたは「ライン全体が返品に等しいの?

if i[-1] == "\n":の代わりに、「行の最後の文字は改行ですか?」というメッセージが表示されます。

各「行」は改行で終わるので、これは自明ですが、単に行を数えるだけで十分です。


あなたは、個々の文字を反復処理したい場合、私はどうなる:

あなたは、彼らはあなたが考えたものされていない終わる場合、彼らはまた、トラブルシューティングに役立つていると思うどのような変数の命名
for line in file: 
    for char in line: 
     dostuff() 


repl.itの例。変数は、bananahenryのように簡単に表示されるように、linecharという名前が付けられていますが、何が起こっているのかがはっきりしません。 ravenは、この例の目的でファイルをシミュレートします。

+0

ありがとうございます。私はファイルを繰り返したときに、そのファイル内の各文字を処理すると思いました。 -1インデックスは魅力的に機能しました。そのような方法で各文字を繰り返し処理するか、ビットを読み取るために開いたようなもの(、 "rb")を実行する必要がありますか? –

+0

ありがとうございます。それは理にかなっている。 –

+0

@DirtyDaver文字をファイルでスキャンする方法を含めるように更新しました。 – TemporalWolf

0

Aはるかに単純なアプローチは

  • 使用することになり、Pythonの組み込みのライン
  • のリストにファイルを分割する機能は、そのリスト
の最後のK要素からあなたの尾を作成

ファイル全体を配列に保持することが問題になる場合は、行単位でファイルを読み込むことができますが、読み込まれた最後のK行だけを保持することができます。ファイルの最後に到達すると、あなたは欲しい。

0

ロジックを簡素化し、Pythonビルトインを使用してみませんか?

def new(): # not a good function name! 
    try: 
     with open('data1.txt') as f: 
      return f.read().count('\n') 
    except FileNotFoundError: 
     print ("No file") 
+0

を高く評価しています。割り当ては、通常、あなた自身で行う必要があります - >もし、それが私のデフォルトの方法であっても、彼らはおそらく(正しい) – TemporalWolf

+0

@TemporalWolfは正解ですが、私たちがそれ以上のことを知っていても、私たちが教えてきたものだけを使うことができます。私はこの方法が好きで、これを念頭に置いています。回答いただきありがとうございます。私は関数new()を書いたのは、コードに実際に追加してGetCharacters()やそのような関数名を与える前に、これをテストしようとしていたからです。 –

関連する問題