例如,我有这些包含这些行的txt文件,
chicken
chicken
duck
duck
duck
parrot
parrot
chicken
chicken
chicken
我如何逐行阅读并将鸡(2行)分成1.txt,鸭(3行)到2.txt和parrot(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文件。因为它被另一只动物分开了。
答案 0 :(得分:1)
您可以尝试:
count = 0
with open("test.txt") as readFile:
previous_line = ""
archive_name = ""
for line in readFile:
if line != previous_line:
previous_line = line
count += 1
archive_name = str(count)+".txt"
with open(archive_name, 'a+') as f:
f.write(line)
这将在1.txt中保存“鸡鸡”,在2.txt中保存“鸭鸭”,在3.txt中保存“鹦鹉鹦鹉”,在4.txt中保存“鸡鸡鸡”
答案 1 :(得分:1)
你可以这样做:
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 group: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的枚举函数来返回索引和迭代器。通常情况如下:for index, item in enumerate(list):
或for ind, i in enumerate(list)
。
现在让我们说我们要合并enumerate
和groupby
。然后我们就可以这样做:for index, (key, group) in enumerate(groupby(object)):
或更紧凑:for ind, (_, g) ...
。在这种情况下我使用_
(这是Pythonic)来表示我对变量(在这种情况下是键)不感兴趣。
答案 2 :(得分:0)
实际上,你还没弄明白。你没有分裂条款;你所做的就是搜索“鸡”,无论它出现在哪里,然后将这些重组的行转储到“chicken.txt”文件中。你没有为任何其他动物做过任何规定,并且没有尝试逻辑来找到那些休息。此外,还有很多多余的代码,例如重复打开输出文件,以及生成从未使用过的num
。
如果需要,在纸上绘制基本逻辑。你缺少的关键步骤是检查以前的动物与当前的动物。这就是
previous = None
with open("test.txt") as zoo:
for animal in zoo:
if animal == previous:
# Process same animal
else:
# Process new animal
previous = animal # remember animal for next iteration
你能从那里拿走吗? for num,enumerate(rl,1):