2

次のような方法で、Pythonのファイルから特定の行番号を削除しようとしています

./foo.py ファイル名.txt 4 5 2919

4 5 と 2919 は行番号です

私がやろうとしていることは次のとおりです。

for i in range(len(sys.argv)):
    if i>1: # Avoiding sys.argv[0,1]
        newlist.append(int(sys.argv[i]))

それで:

count=0

generic_loop{ 
   bar=file.readline()
   count+=1
   if not count in newlist:
      print bar
}

元のファイルのすべての行を出力します(間に空白を入れて)

4

4 に答える 4

3

enumerate行番号を決定するために使用できます。

import sys
exclude = set(map(int, sys.argv[2:]))
with open(sys.argv[1]) as f:
    for num,line in enumerate(f, start=1):
        if num not in exclude:
            sys.stdout.write(line)

start=10 から数え始めると削除できます。上記のコードでは、行番号は 1 から始まります。

$ python3 so-linenumber.py so-linenumber.py 2 4 5
import sys
with open(sys.argv[1], 'r') as f:
            sys.stdout.write(line)

コンテンツをファイル自体に書き込みたい場合は、sys.stdout ではなく一時ファイルに書き込み、次のように元のファイル名に名前を変更します (またはコマンド ラインでスポンジを使用します)。

import os
import sys
from tempfile import NamedTemporaryFile
exclude = set(map(int, sys.argv[2:]))
with NamedTemporaryFile('w', delete=False) as outf:
    with open(sys.argv[1]) as inf:
        outf.writelines(line for n,line in enumerate(inf, 1) if n not in exclude)
    os.rename(outf.name, sys.argv[1])
于 2013-05-06T02:16:03.983 に答える
2

次のようなことを試すことができます:

import sys
import os
filename= sys.argv[1]
lines = [int(x) for x in sys.argv[2:]]

#open two files one for reading and one for writing

with open(filename) as f,open("newfile","w") as f2:

#use enumerate to get the line as well as line number, use enumerate(f,1) to start index from 1
    for i,line in enumerate(f):  
        if i not in lines:     #`if i not in lines` is more clear than `if not i in line`
            f2.write(line)   
os.rename("newfile",filename)  #rename the newfile to original one    

一時ファイルの生成にはtempfileモジュールを使用する方がよいことに注意してください。

于 2013-05-06T02:17:18.803 に答える
2
import sys
# assumes line numbering starts with 1
# enumerate() starts with zero, so we subtract 1 from each line argument
omitlines = set(int(arg)-1 for arg in sys.argv[2:] if int(arg) > 0)
with open(sys.argv[1]) as fp:
    filteredlines = (line for n,line in enumerate(fp) if n not in omitlines)
    sys.stdout.writelines(filteredlines)
于 2013-05-06T02:21:37.050 に答える