我有一个包含行的文本文件。我想剪切其编号在列表中的行,并将它们放入另一个文件中。
例如,如果我有一个包含[1, 3, 67]
的列表,那么我想将行号1,行号3和行号67放入一个新文件中,并从原始文件中删除它们。在Python中最简单的方法是什么?
答案 0 :(得分:2)
如果您不想将所有行保留在内存中,这是一个想法:
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()
获取所有行的列表但是对我来说无论如何它都没有意义,所以我会做我上面展示的。但是,您可以这样做:
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:然后您还需要编写两个新文件:一个包含这些行,另一个包含其余行。为此,open
文件并使用文件对象的writelines
方法。
答案 1 :(得分:0)
使用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']