读取文件,创建只包含片段块的新文件

时间:2012-01-12 20:48:34

标签: python

我有一个看起来像的文本文件:

text texttext texttext texttext texttext text
text texttext texttext texttext text
==========[start log]====
..
..
..
==============


testtextexttexttesttextexttext
testtextexttexttesttextexttext

==========[start log]====
..
..
..
==============

所以我想创建一个只有以下块的新文件:

==========[start log]=== 
..
..
..
=============

所有===块下面都有2个空白行。

块内的...实际上是文本。

5 个答案:

答案 0 :(得分:3)

import re

regex = re.compile('==============.+?==============', re.DOTALL)

with open('in.txt', 'r') as f:
    content = f.read()
matches = regex.findall(content)

答案 1 :(得分:3)

您可以逐行进行,只复制您想要的内容。

old = open('old.txt', 'r')
new = open('new.txt', 'w')

in_block = False

for line in old:
    if line.startswith('===='):
        in_block = not in_block # Oposite
        new.write(line)
    elif in_block:
        new.write(line)

old.close()
new.close()

将它放在'new.txt'中。

==============
..
..
..
==============
==============
..
..
..
==============

答案 2 :(得分:0)

使用sed非常容易:

sed -n '/==============/,/==============/p' example.txt

收率:

==============
..
..
..
==============
==============
..
..
..
==============

答案 3 :(得分:0)

从我的阅读中,我认为您不会试图将文字包含在' ===='

之外。

raw = open(the_file).read()
parts = raw.split("=============")
new_parts = []
for ii, part in enumerate(parts):
    if not (ii % 2): continue
    new_parts.append(part)
new_raw = "=============".join(new_parts)
open(new_file, 'w').write(new_raw)

答案 4 :(得分:0)

我的偏好是使用生成器来处理块之前的材料与块内的材料之间的“状态变化”。

你真的在阅读一个头尾序列。头是(文字,'=== ......',更多文字,'=== ......')。尾巴是头尾序列。定义是尾递归,允许我们将其展平为循环

def gen_block_sequence( some_source ):
    block_iter= tier(some_source):
    for line in block_iter:
        if line == '==============':
            block= list( gen_head(block_iter)
            yield block

def gen_head( block_iter ):
    for line in block_iter:
        if line == '==============':
            break
        yield line

虽然这很长,但我发现它可以很好地适应大量额外的处理和决策。