5

ここにテキストファイルの例があります

the bird flew
the dog barked
the cat meowed

これは、削除したいフレーズの行番号を見つけるための私のコードです

phrase = 'the dog barked'

with open(filename) as myFile:
    for num, line in enumerate(myFile, 1):
        if phrase in line:
            print 'found at line:', num

私が試した行番号(num)を削除できるようにするには、これに何を追加できますか

lines = myFile.readlines()
del line[num]

しかし、これは機能しません。これにどのようにアプローチすればよいですか?

4

7 に答える 7

3

私は効率的に機能し、ファイルオブジェクト内の行の面倒でエレガントではないすべてのカウントを行わずにうまくいく別のソリューションを見つけました:

del_line = 3    #line to be deleted: no. 3 (first line is no. 1)

with open("textfile.txt","r") as textobj:
    list = list(textobj)    #puts all lines in a list

del list[del_line - 1]    #delete regarding element

    #rewrite the textfile from list contents/elements:
with open("textfile.txt","w") as textobj:
    for n in list:
        textobj.write(n)

欲しい人のための詳細な説明:

(1) 削除したい行番号の整数値を含む変数を作成します。行番号 3 を削除するとします。

del_line = 3

(2) テキスト ファイルを開き、ファイル オブジェクトに配置します。今のところ、reading-mode だけが必要です。次に、その内容をリストに入れます。

with open("textfile.txt","r") as textobj:
    list = list(textobj)

(3) これで、すべての行が「リスト」のインデックス付き要素になります。削除したい行を表す要素を削除することで続行できます。

del list[del_line - 1]

この時点で、行番号を取得した場合。これはユーザー入力から削除されるはずですが、文字列形式になる可能性が高いため、最初に必ず整数に変換してください(「input()」を使用した場合)。

リストの要素インデックスが 0 から始まるため、del_line - 1 です。この場合、リスト内の正しい要素をキャッチするには、1 を差し引く必要があります。

(4) リストファイルを再度開きます。今度は「書き込みモード」で、完全なファイルを書き換えます。その後、更新されたリストを繰り返し処理し、「リスト」のすべての要素をファイルに書き直します。元のファイルの内容をリストに入れる時点 (ステップ 2) で、\n エスケープもリスト要素にコピーされるため、改行について心配する必要はありません。

with open("textfile.txt","w") as textobj:
    for n in list:
        textobj.write(n)

これは、特定のテキスト ファイルのどの行を削除するかをユーザーに決定してもらいたいときに役に立ちました。Martijn Pieters の答えは sth だと思います。似ていますが、彼の説明は私にはほとんどわかりません。

于 2016-01-08T15:49:23.547 に答える
2

numが削除する行番号であると仮定します。

import numpy as np
a=np.genfromtxt("yourfile.txt",dtype=None, delimiter="\n") 
with open('yourfile.txt','w') as f:    
    for el in np.delete(a,(num-1),axis=0):
        f.write(str(el)+'\n')
于 2013-07-19T15:13:37.150 に答える
0

1から数え始めますが、Python のインデックスは常に 0 から始まります。

行数をゼロから開始します。

for num, line in enumerate(myFile):  # default is to start at 0

または から 1 を引き、 からnum削除しますlines(ではないline):

del lines[num - 1]

.readlines()呼び出しで行を返すには、最初にファイルを再度開くか、最初にシークする必要があることに注意してください。

myFile.seek(0)
于 2013-07-19T13:39:36.050 に答える
0

試す

lines = myFile.readlines()  

mylines = [x for x in lines if x.find(phrase) < 0]  
于 2013-07-19T14:10:28.690 に答える