行を含むテキストファイルがあります。リストにある番号の行を切り取って、別のファイルに入れたいです。
たとえば、を含むリストがある場合[1, 3, 67]
、行番号1、行番号3、および行番号67を新しいファイルに入れて、元のファイルから削除します。Pythonでそれを行う最も簡単な方法は何ですか?
すべての行をメモリに保持したくない場合のアイデアを次に示します。
def lines(fname, numbers):
numbers = sorted(numbers, reverse=True)
with open(fname) as f:
for n, line in enumerate(f, 1):
if n == numbers[-1]:
yield line
numbers.pop()
if not numbers:
break
ドキュメントへのリンク:
編集:ファイル全体を一度に読み取っても問題ない (そして行のリストを返したい) 場合は、 を使用readlines()
してすべての行のリストを取得できますが、とにかく意味がないので、私は ' d 私が上に示したことを行います。ただし、次のことができます。
def lines(fname, numbers):
with open(fname) as f:
lines = f.readlines()
return [lines[i] for i in numbers]
「自然な」番号付けが必要な場合はに変更lines[i]
します。lines[i+1]
Edit2:次に、 2 つの新しいファイルを作成する必要があります。1 つはこれらの行を含み、もう 1 つは残りの行を含みます。これを行うには、open
ファイルを作成し、ファイル オブジェクトのwritelines
メソッドを使用します。
使用itertools.islice()
:
たとえば、ファイルが次の場合:
1
2
3
4
5
6
7
8
9
コード:
In [107]: li=[2,4,6] # this list should be sorted first
In [108]: with open("abc.txt") as f:
prev=0
for num in li:
print list(islice(f,num-prev-1,num-prev))
prev=num
.....:
['2\n']
['4\n']
['6\n']
In [109]: li=[1,7,9]
In [110]: with open("abc.txt") as f:
prev=0
for num in li:
print list(islice(f,num-prev-1,num-prev)) #print or do something else
prev=num
.....:
['1\n']
['7\n']
['9\n']