【问题标题】:How do I write in a new text file every x lines? [python] [duplicate]如何每 x 行写入一个新的文本文件? [蟒蛇] [重复]
【发布时间】:2015-03-31 10:43:59
【问题描述】:

假设我有一个包含 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()

这是我尝试过的,以及其他一些解决方案。我有一种感觉,我错过了一些简单的东西。

这与上面指出的另一个问题不同,因为这是一个文本文件,而这是一个列表。

【问题讨论】:

  • 您似乎已经解释了您想要实现的目标...但是如果您可以提供诸如您尝试过的内容以及遇到困难的地方等信息,那么也许有人会愿意帮助您出...
  • 好吧,让我复制我的代码。
  • count += sep 中的sepcount &lt;= x 中的x 是什么?看来您没有重置计数变量
  • 我感觉我错过了一些简单的东西 ...是的,最后一行的括号
  • @Alfie 已修复。 Sep 与 x 相同。我只是将 sep 重命名为 x 以使其简单。 Bhargav:是的,我没有正确复制它。固定。

标签: python text split


【解决方案1】:

使用生成器来拆分行列表,如下所示:

>>> 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 在运行之前必须存在。

【讨论】:

  • 谢谢!请您评论一下您的代码吗?
  • @Aurora,您对哪一行感到困惑?
  • 在第二行中,len(lines) 是否返回列表中的条目数?产量有什么作用?这是什么意思:'for index, lines in enumerate' 什么是 .join()?
  • @Aurora, len(lines) 返回列表中元素的数量。 yield 创建一个生成器函数。如果您对此不熟悉,请使用 Goole python yieldpython generator。您将获得大量教程。这是一个非常强大的概念。 enumerate 很简单。它允许您摆脱手动递增计数器。 join 方法使用分隔符连接列表的所有元素。这里\n 是分隔符。
  • 好吧,我想我明白了。再次感谢您。
【解决方案2】:

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))

【讨论】:

  • 这些行已经有一个 EOL 字符,所以"\n".join(ele) 将添加空行...不妨使用f.witelines(ele)
  • @JonClements,真的,我首先使用了不同的方法。不确定 OP 是否需要单行或每行一个的所有条目,数据显然来自列表
  • 我想另一件事是最后一个文件可能有多达 9 个空行......我认为这是否可取取决于 OP
  • @JonClements,如果 len(l) 不均匀地除以 n,OP 可以使用 zip/izip,如果他们不介意可能丢失数据
  • @JonClements,偷了它:),只需要使用连接来分离数据
猜你喜欢
  • 2021-10-31
  • 2022-08-17
  • 2012-08-20
  • 1970-01-01
  • 1970-01-01
  • 2016-08-13
  • 1970-01-01
  • 2019-09-20
  • 1970-01-01
相关资源
最近更新 更多