2015-11-15 33 views
1

我有一个生成字符串的生成器,我需要将它写入输出文件。但是,我还需要让每个输出文件包含固定数量的行。我也想逐步做到这一点。这意味着我不想保存内存中的所有行,并将它们同时刷新到一个文件中,因为每个文件所需的行数可能很大。在Python中使用固定行数写入多个文件

我似乎无法找到一种方法来在Python中使用“with”语句来完成此操作。

喜欢的东西:

for line in line_generator: 
    write_to_output_file(line, _MAX_LINES_PER_FILE) 

回答

0

下面将更改目标文件中的每个_MAX_LINES_PER_FILE

for i, line in enumerate(line_generator): 
    if not i % _MAX_LINES_PER_FILE: 
     # open a new output file 
     output_file = open(filename_generator(i // _MAX_LINES_PER_FILE), "w") 

    print >> output_file, line 
+1

就这样,您的答案会泄漏文件描述符,因为文件从不关闭。 –

+0

当新的'output_file'打开时(因为它的引用计数变为零),该文件被隐式关闭 – donkopotamus

+0

由于您正在为每行打开一个文件,这会带来很多开销吗? – scabbage

0

你可以使用itertools.islice如果你不介意在内存中存储的每个部分:

from itertools import islice 


def write_slices(g, n): 
    for ind, sli in enumerate(iter(lambda: list(islice(g, n)), []), 1): 
     with open("out_{}".format(ind), "w") as f: 
      f.writelines(sli) 

或者只是一行一行:

def write_slices(g, n): 
    for ind, line in enumerate(g): 
     with open("out_{}".format(ind), "w") as f: 
      f.write(line) 
      f.writelines(islice(g, n-1)) 
+0

看起来你正在一行一行地打开和关闭一个文件。这不会造成很大的开销吗? – scabbage

+0

@scabbage。我们只在每个部分打开一次文件,writelines每次从迭代中写入一整行代码 –

+0

我的意思是在第二个版本的实现中。我当然希望逐行添加到文件中。 – scabbage

相关问题