如何每 x 行写入一个新的文本文件? [python]
How do I write in a new text file every x lines? [python]
假设我有一个包含 10,000 个条目的列表。用户输入一个数字,比如 10。我需要做的是将列表中的所有条目写入 .txt 文件,但每个文件只写入 10 个。所以程序会写前10个,然后创建一个新文件,然后写下10个...等等
谢谢
count = 0
ext = 0
path = 'New/' + str(ext) + '.txt'
open(path, 'a').close()
for line in flines:
f = open(path, 'a')
if count <= x:
f.write(line)
count += 1
else:
ext += 1
path = 'New/' + str(ext) + '.txt'
count += x
f.close()
这是我尝试过的方法,以及其他一些解决方案。我觉得我错过了一些简单的东西。
这与上面指出的另一个问题不同,前者讨论的是文本文件,后者讨论的是列表。
使用生成器拆分行列表如下:
>>> def splited_lines_generator(lines, n):
... for i in xrange(0, len(lines), n):
... yield lines[i: i + n]
...
>>> for index, lines in enumerate(splited_lines_generator(['a', 'b', 'c', 'd', 'e'], 2)):
... with open('new/' + str(index) + '.txt', 'w') as f:
... f.write('\n'.join(lines))
...
我使用了 ['a', 'b', 'c', 'd', 'e']
和 2 作为示例。在 运行 之后将创建这三个文件,前两个将包含两行,最后一个将包含一行(仅 e
)。请注意,目录 new
必须在 运行 之前存在。
使用 itertools.grouper recipe 很容易做到:
from itertools import izip_longest
n = 2
l = ["1", "2", "3", "4", "5", "6"]
def grouper(iterable, n, fillvalue=""):
args = [iter(iterable)] * n
return izip_longest(fillvalue=fillvalue, *args)
for ind, ele in enumerate(grouper(l[:-n], n)):
with open("new_{}.txt".format(ind), "w") as f:
f.writelines(ele)
如果您不关心丢失数据,请使用 zip/izip。
为了在最后一个文件中没有任何空行并且仍然不丢失数据,正如@Jon Clements 建议我们可以过滤:
it = iter(l)
for num, chunk in enumerate(iter(lambda: list(islice(it, n)), []), 1):
with open('output{}'.format(num), 'w') as fout:
fout.write("\n".join(chunk))
假设我有一个包含 10,000 个条目的列表。用户输入一个数字,比如 10。我需要做的是将列表中的所有条目写入 .txt 文件,但每个文件只写入 10 个。所以程序会写前10个,然后创建一个新文件,然后写下10个...等等
谢谢
count = 0
ext = 0
path = 'New/' + str(ext) + '.txt'
open(path, 'a').close()
for line in flines:
f = open(path, 'a')
if count <= x:
f.write(line)
count += 1
else:
ext += 1
path = 'New/' + str(ext) + '.txt'
count += x
f.close()
这是我尝试过的方法,以及其他一些解决方案。我觉得我错过了一些简单的东西。
这与上面指出的另一个问题不同,前者讨论的是文本文件,后者讨论的是列表。
使用生成器拆分行列表如下:
>>> def splited_lines_generator(lines, n):
... for i in xrange(0, len(lines), n):
... yield lines[i: i + n]
...
>>> for index, lines in enumerate(splited_lines_generator(['a', 'b', 'c', 'd', 'e'], 2)):
... with open('new/' + str(index) + '.txt', 'w') as f:
... f.write('\n'.join(lines))
...
我使用了 ['a', 'b', 'c', 'd', 'e']
和 2 作为示例。在 运行 之后将创建这三个文件,前两个将包含两行,最后一个将包含一行(仅 e
)。请注意,目录 new
必须在 运行 之前存在。
使用 itertools.grouper recipe 很容易做到:
from itertools import izip_longest
n = 2
l = ["1", "2", "3", "4", "5", "6"]
def grouper(iterable, n, fillvalue=""):
args = [iter(iterable)] * n
return izip_longest(fillvalue=fillvalue, *args)
for ind, ele in enumerate(grouper(l[:-n], n)):
with open("new_{}.txt".format(ind), "w") as f:
f.writelines(ele)
如果您不关心丢失数据,请使用 zip/izip。
为了在最后一个文件中没有任何空行并且仍然不丢失数据,正如@Jon Clements 建议我们可以过滤:
it = iter(l)
for num, chunk in enumerate(iter(lambda: list(islice(it, n)), []), 1):
with open('output{}'.format(num), 'w') as fout:
fout.write("\n".join(chunk))