0

我有一个巨大的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
4

3 回答 3

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))

请注意,文件将指向 line 之后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
于 2013-08-07T23:30:19.977 回答
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 开始。

于 2013-08-07T23:26:09.407 回答
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])
于 2013-08-07T23:54:26.493 回答