1

30秒ごとにテキストの最初の行を繰り返し削除したいテキストドキュメントがあります。

リセットまたはキャンセルを求められない場合に、30秒ごとにノンブロッキングで関数を呼び出すことができるPythonリセット可能タイマーオブジェクトのコードをすでに記述しています(またはより正確にコピーしています)。

Pythonのリセット可能なタイマーはキャンセルされるまで繰り返されます

(誰かが私がリピートを実装した方法をチェックできれば、それを実行しているときに私のPythonがクラッシュすることがあるので、大丈夫です:))

ここで、テキストファイルをロードする関数を記述し、おそらく最初の行を除くすべてをコピーしてから、同じテキストファイルに書き直したいと思います。私はこれを行うことができます、私はこのように思います...しかしそれは最も効率的ですか?

def removeLine():

    with open(path, 'rU') as file:
        lines = deque(file)
        try:
            print lines.popleft()
        except IndexError:
            print "Nothing to pop?"
    with open(path, 'w') as file:
        file.writelines(lines)  

これは機能しますが、それを行うための最良の方法ですか?

4

1 に答える 1

3

私はfileinputモジュールを次のように使用しますinplace=True

import fileinput

def removeLine():
    inputfile = fileinput.input(path, inplace=True, mode='rU')
    next(inputfile, None)  # skip a line *if present*
    for line in inputfile:
        print line,  # write out again, but without an extra newline
    inputfile.close()

inplace=Truesys.stdout開いているファイルにリダイレクトされるため、行を「印刷」するだけです。

このnext()呼び出しは、最初の行をスキップするために使用されます。デフォルトを指定すると、空のファイルNoneの例外が抑制されます。StopIteration

これにより、 readlinesバッファをメモリに保持するだけでよいため、大きなファイルの書き換えがより効率的になります。fileinput

dequeあなたの解決策であっても、aはまったく必要ないと思います。next()そこでも使用list()し、残りの行をキャッチするために使用します。

def removeLine():
    with open(path, 'rU') as file:
        next(file, None)  # skip a line *if present*
        lines = list(file)
    with open(path, 'w') as file:
        file.writelines(lines)  

ただし、これにはメモリ内のすべてのファイルを読み取る必要があります。大きなファイルではそれを行わないでください。

于 2013-03-27T11:15:35.137 に答える