python - 如何将出现的字符串拆分为单个 txt 文件?
问题描述
例如,我有包含这些行的 txt 文件,
chicken
chicken
duck
duck
duck
parrot
parrot
chicken
chicken
chicken
如何逐行阅读并将鸡(2 行)拆分为 1.txt,鸭(3 行)拆分为 2.txt,鹦鹉(2 行)拆分为 3.txt,最后一只鸡(3 行)拆分为4.txt?
到这里我才明白,
count = 0
with open("test.txt") as rl:
for num, line in enumerate (rl, 1):
s = list(line)
if "chicken" in line:
count += 1
finaljoin = "".join(s)
print(count)
with open("chicken.txt", 'a+') as f:
f.write(finaljoin)
但是我上面的解决方案只将整只鸡(总共 5 只)抓到一个文件中。实际的计划是将第一两行抓取到一个 txt 文件,最后两行鸡到另一个 txt 文件。因为它正在被另一种动物分裂。
解决方案
你可以这样做:
from itertools import groupby
with open('test.txt') as f:
data = f.read().split('\n')
for ind, (_, g) in enumerate(groupby(data),1):
with open('{}.txt'.format(ind), 'w') as f:
f.write('\n'.join(g))
解释:
您可以在此处阅读有关 Itertools groupby 的信息:https ://docs.python.org/2/library/itertools.html#itertools.groupby 。
Groupby 将返回两个元素,键和组。因此,如果我们想遍历 groupby,我们会做这样的事情:for key, group in groupby(object):
或者for k, g in groupby(object):
现在在这种情况下,键将是chicken, duck, parrot, chicken
,组将是['chicken', 'chicken'] , ['duck','duck... ...]
但是(现在是我解释的部分ind, (_, g)
),要在循环时获取索引,我们可以使用 Python 的 enumerate 函数,该函数将返回索引和迭代器。通常它看起来像这样:for index, item in enumerate(list):
或for ind, i in enumerate(list)
.
现在假设我们要合并enumerate
and groupby
。然后我们可以这样做:for index, (key, group) in enumerate(groupby(object)):
或更紧凑:for ind, (_, g) ...
。我_
在这种情况下使用(这是 Pythonic)来表示我对变量不感兴趣(在这种情况下是键)。
推荐阅读
- javascript - 只读输入的千位分隔符
- javascript - React-Native-Maps:地图为空。仅显示 Google 徽标和标记
- firebase - 反应原生地图方向
- angular - Angular 12.2 导致 Typescript 出现优化问题。所有类型都具有相同的名称并启用了优化
- javascript - 如何保持使用 auth0 登录的 React 应用程序
- vue.js - 无法更新引导 vue 表中的数据
- encryption - 如何从未删除的加密文件中获取原始文件?
- javascript - 在Javascript中从数组中过滤一组字母
- nixos - 创建具有自定义固件支持的可引导 USB
- python-3.x - 通过 openpyxl 使用公式从 Excel 单元格中获取值