我有一个包含行的文本文件。我想剪切列表中的编号,并将它们放入另一个文件中。从文本中切出一些特定的行并将它们放到另一个文件中
例如,如果我有一个包含[1, 3, 67]
的列表,那么我想将行号1,行号3和行号67放入一个新文件中,并将它们从原始文件中删除。在Python中最简单的方法是什么?
我有一个包含行的文本文件。我想剪切列表中的编号,并将它们放入另一个文件中。从文本中切出一些特定的行并将它们放到另一个文件中
例如,如果我有一个包含[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()
来获取所有行的列表,但对我而言,它无论如何都是没有意义的,所以我会按照上面显示的内容进行操作。但是,你可以这样做:
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
方法。
使用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']
既然你要一个发电机为导向实现,我想'izip'会更好? –
@LevLevitsky对于我来说,保留所有内存行并不是一个问题,因为不是一个很大的数字,你可以在这种情况下提供另一个代码版本吗?谢谢 – shn
@ SanjayT.Sharma好的,谢谢。我忘记了'zip'返回了一个列表,因为如果可能的话我尝试使用Python 3。在Python 3中'itertools.izip'不存在,因为'zip'在Python 2上做了'izip'。 –