将一个txt文件拆分成N行每行?

Split a txt file into N lines each?

我想将一个非常大的 .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 文件相同的结构和样式。

并且此代码在到达文件末尾时也不会自动终止。如果可能的话,我希望代码停止写入文件并退出 没有数据可写。

问题是 itertools.islice returns 一个迭代器,你在你的文件中写 str 这是 python 中函数的表示(显示身份对象):

< itertools.islice object at 0x7f8fa94a4940 >

作为将迭代器分割成相等部分的更简单的方法,您可以使用以下 grouper 函数,python wiki 将其建议为 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)

您可以将您的文件对象作为迭代器传递给函数,然后遍历结果并将它们写入您的文件:

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.

您可以将 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)