2015-11-15 34 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

相關問題