2015-12-21 97 views
3

我想将一个非常大的.txt文件分割成相等的部分文件,每个部分包含N行。并将其保存到一个文件夹将一个txt文件分成N行?

with open('eg.txt', 'r') as T: 
    while True: 
     next_n_lines = islice(T, 300) 
     f = open("split" + str(x.pop()) + ".txt", "w") 
     f.write(str(next_n_lines)) 
     f.close() 

但这创建了数据

" < itertools.islice object at 0x7f8fa94a4940 >" 
txt文件

一个文件。

我想保持相同的结构和风格保持在原来的txt文件。

,当它到达文件末尾,以及该代码不会自动终止。如果可能的话,我会让代码停止写入文件并退出,如果 没有数据可写。

回答

3

您可以使用iterislice,用枚举给你的文件唯一的名称取n行的时间。 f.writelines将每条线路列表写入新文件:

with open('eg.txt') as T: 
    for i, sli in enumerate(iter(lambda:list(islice(T, 300)), []), 1): 
     with open("split_{}.txt".format(i), "w") as f: 
      f.writelines(sli) 

你的代码循环永远为你不包含任何破发状态,使用iter对空列表将意味着循环结束时,迭代器已经耗尽。

此外,如果你想通过一个islice对象写出来,你可以在它上面调用writelines,即f.writelines(next_n_lines),str(next_n_lines)

+0

对于任何人发现这几年下来,你需要把这个上面的代码。 https://docs.python.org/3/library/itertools.html#itertools.islice –

2

问题是达itertools.islice返回迭代和你正在写它在你的文件str这是在Python中的函数表示(显示对象的身份):

< itertools.islice object at 0x7f8fa94a4940 > 

至于更pythinic方式切片一个迭代器相等的部分,您可以使用下面grouper功能,它已建议由蟒蛇维基为itertools recipes

def grouper(iterable, n, fillvalue=None): 
    "Collect data into fixed-length chunks or blocks" 
    # grouper('ABCDEFG', 3, 'x') --> ABC DEF Gxx" 
    args = [iter(iterable)] * n 
    return zip_longest(*args, fillvalue=fillvalue) 

你可以通过你的文件对象作为iterato R键对结果的功能,然后循环,并将其令状文件:

with open('eg.txt', 'r') as T: 
    for partition in grouper(T,300): 
     # do anything with `partition` like join the lines 
     # or any modification you like. Then write it in output. 
相关问题