如何从文本文件中获取两个特定单词之间的所有单词,并使用python将其写入新的文本文件中

时间:2014-01-12 03:38:19

标签: python

假设我有一个包含

的文本文件
Section 1
What: random1 
When: random2
Why:  random3 
Where: random4
How: random5
Section 2
What: dog1
When: dog2
Why: dog3
Where: dog4
How: dog5
Section 3
What: me1
When: me2
Why: me3
Where: me4
How: me5

我想创建一个函数来获取文本文件并查找两个单词并复制其间的所有内容并继续收集数据并将其放入新的文本文件中。

例如:def my_function(document, start, end):在交互窗口中我会放置my_function("testing.txt, "when", "why"),它应该创建一个包含数据的新文本文件:

when: random2
when: dog2
when: me2

因此该函数获取这两个单词之间的所有数据,并且这两个单词出现不止一次,因此它必须不断查看文件。

另一个线程中的用户发布了一个可以帮助我的解决方案,但我不知道如何将它放在一个函数中,我不明白使用的代码。

这是来自different thread,解决方案:falsetru

import itertools

with open('data.txt', 'r') as f, open('result.txt', 'w') as fout:
   while True:
      it = itertools.dropwhile(lambda line: line.strip() != 'Start', f)
      if next(it, None) is None: break
      fout.writelines(itertools.takewhile(lambda line: line.strip() != 'End', it))

2 个答案:

答案 0 :(得分:0)

def fn(fname, start, end):
    do_print = False
    for line in open(fname).readlines():
        if line.lower().startswith(start.lower()):
            do_print = True
        elif line.lower().startswith(end.lower()):
            do_print = False
        if do_print:
            print(line.strip())

这会产生输出:

>>> fn('testing.txt', 'when', 'why')
When: random2
When: dog2
When: me2

它的工作方式是逐行浏览文件,每当行以start开头时设置标志True,每当行以end开头时设置为False。当标志为True时,将打印该行。

由于帖子中的示例有大小写混合,我使用方法lower使测试不区分大小写。

答案 1 :(得分:0)

这将按照您的描述进行。我添加了一个dest_path输入来指定输出文件。

def my_function(source_path, dest_path, start_text, stop_text):
    # pre-format start and end to save time in loop (for case insensitive match)
    lower_start = start_text.lower()
    lower_stop = stop_text.lower()
    # safely open input and output files
    with open(source_path, 'r') as source, open(dest_path, 'w') as dest:
        # this variable controls if we're writing to the destination file or not
        writing = False
        # go through each line of the source file
        for line in source:
            # test if it's a starting or ending line
            if line.lower().startswith(lower_start): writing = True
            elif line.lower().startswith(lower_stop): writing = False
            # write line to destination file if needed
            if writing: dest.write(line)

请注意,with块完成后文件会自动关闭。