fileinput - 索引行乱序

时间:2013-08-07 23:20:15

标签: python

我有一个巨大的txt文件。我不能使用readlines()来读取它,因为出现了内存错误,所以我开始使用fileinput。  它运行良好,直到我需要将其中的一些行写入另一个文件,然后我“无序访问行”。 这是我脚本的一部分:

input_4=fileinput.input([plik0_a])
out=open('out_file','w')
for i in range(s,e):
    out.writelines('%s' % input[i])

请帮我找一个写行的方法,这个数字是== i。 我认为这并不难,但我只是一个初学者:)。

我需要一些可以像这样工作的东西(下面的脚本的一部分)和大文件。

n=10918 
s=(int(start)-n) 
e=(int(end)-n+1)                                                
czyta_4=open(plik0_a,'r') 
zczyta_4=czyta_4.readlines()
for i in range(s,e):
  out.writelines('%s' % i +': '+ '%s' % zczyta_4[i])

我得到的结果(我希望得到一个巨大的文件,如下所示):

0: fixedStep chrom=chr1 start=10918 step=1
1: 0.064 
2: 0.058 
3: 0.064 
4: 0.058 
5: 0.064 
6: 0.064 
7: 0.064 
8: 0.064 
9: 0.064 
10: 0.058
.
.
.
s : 0.058

3 个答案:

答案 0 :(得分:2)

您不需要使用fileinput,文件对象是可迭代的

import itertools
with open(plik0_a) as input_4, open('out_file','w') as out:
    out.writelines(itertools.islice(input_4, s, e))

请注意,该文件将指向行e之后,因此如果您想要更多行,则必须减去该行。

例如

import itertools
with open(plik0_a) as input_4, open('out_file','w') as out:
    out.writelines(itertools.islice(input_4, 10, 20)) # lines 11-20
    out.writelines(itertools.islice(input_4, 10, 20)) # lines 31-40

答案 1 :(得分:1)

使用itertools.islice

import itertools
input_4=fileinput.input([plik0_a])
out=open('out_file','w')
out.writelines(itertools.islice(input_4, s, e))

如果您正在处理单个文件,则可能根本不需要fileinput - 可以直接迭代文件而无需将整个内容加载到内存中。虽然在命令行上指定文件仍然非常方便。为了示范:

import itertools
with open('in_file','r') as input_4:
    with open('out_file', 'w') as out:
        out.writelines(itertools.islice(input_4, s, e)) 

要在输出中包含原始行号,请使用enumerate。这将产生行号和行本身的元组。它看起来像这样:

import itertools
input_4=fileinput.input([plik0_a])
out=open('out_file','w')
for (line_number, line) in itertools.islice(enumerate(input_4), s, e):
    out.write('%s: %s' % (line_number, line))

或者,使用生成器表达式:

import itertools
input_4=fileinput.input([plik0_a])
out=open('out_file','w')
out.writelines(('%s: %s' % (line_number, line) for (line_number, line) in itertools.islice(enumerate(input_4), s, e)))

enumerate返回一个迭代器,所以你也可以islice。默认情况下,它从0开始,您的示例显示的可能是您想要的,但在2.6及更高版本中它接受一个可选的start参数,因此如果您愿意,可以从1开始。

答案 2 :(得分:0)

infile = open('infile.txt', 'r')
outfile=open('outfile.txt', 'w')
line=[]
for a in infile:
    line.append(a)
outfile.write(line[number of line to be printed])

## example: If you want to print first line
## outfile.write(line[0])
## outfile.write(line[1]) ## for second line
## if you have a list of lines to be printed
infile = open('infile.txt', 'r')
outfile=open('outfile.txt', 'w')
line=[]
for a in infile:
    line.append(a)
line_list =[] ## list of line numbers
for b in line_list:
    outfile.write(line[b])