【问题标题】:Operating on a file with a very specific format [duplicate]对具有非常特定格式的文件进行操作[重复]
【发布时间】:2016-10-31 09:29:54
【问题描述】:

我一直在尝试编写以下函数:

def track(filepath,n1,n2)

此函数旨在对具有以下格式的文件进行操作:

-BORDER-
text
-BORDER-
text
-BORDER-
text
-BORDER-

我如何告诉函数对该文件路径进行操作,更准确地说是对每个边框内的文本进行操作?

【问题讨论】:

  • 您的文件是.txt 文件吗?你的边框线之间总是只有一个文本行吗?
  • 是的,但是在边界线之间我总是会有更多的文本行
  • 如果我明白了:您的边框线之间可能有许多文本行,并且您的边框线都相同?
  • 是的,文本的开头和结尾由仅包含单词-BORDER-的行标记

标签: python python-3.5 atom-editor


【解决方案1】:

以下方法将读取您的文件,并为您提供非边界线列表:

from itertools import groupby

with open('input.txt') as f_input:
    for k, g in groupby(f_input, lambda x: not x.startswith('-BORDER-')):
        if k:
            print([line.strip() for line in g])

所以如果你的输入文件是:

-BORDER-
text
-BORDER-
text
-BORDER-
this is some text
with words 
on different lines
-BORDER- 

它将显示以下输出:

['text']
['text']
['this is some text', 'with words', 'on different lines']

这可以通过逐行读取文件,并使用 Python 的 groupby 函数对与给定测试匹配的行进行分组来实现。在这种情况下,测试是行是否以-BORDER- 开头。它返回以下所有返回相同结果的行。 k 是测试结果,g 是匹配行组。所以如果测试结果是True,说明它不是以-BORDER-开头的。

接下来,由于您的每一行都有一个换行符,因此使用列表推导从每个返回的行中删除它。


如果您想计算单词(假设它们由空格分隔),那么您可以执行以下操作:

from itertools import groupby

with open('input.txt') as f_input:
    for k, g in groupby(f_input, lambda x: not x.startswith('-BORDER-')):
        if k:
            lines = list(g)
            word_count = sum(len(line.split()) for line in lines)
            print("{} words in {}".format(word_count, lines))

给你:

1 words in ['text\n']
1 words in ['text\n']
9 words in ['this is some text\n', 'with words \n', 'on different lines\n']

【讨论】:

  • 以及如何对文件的-BORDER-文本-BORDER-进行操作?
  • 如果您取出if 行,它将显示所有行分组。或者如果你把not 拿出来,它只会在-BORDER- 行上工作。或者,您可以将 else 行添加到 if
  • 我还能计算每个“段落”或所有段落中与给定属性匹配的单词吗?
  • 我在答案中添加了一个合适的示例来帮助您入门。
【解决方案2】:

编写一个生成器,计数检测边界线并使用groupby 分隔这些块:

from itertools import groupby

BORDER = '--border--'

def count_border(lines, border):
  cnt = 0
  for line in lines:
    if line.strip() == border:
        cnt += 1
    else:
        yield cnt, line

with open('file') as lines:
    for _, block in groupby(count_border(lines, BORDER), lambda (c,_): c):
        block = [line for _, line in block]
        print(block)

【讨论】:

    【解决方案3】:

    要从文本文件中检索文本,您可以执行以下操作:

    with open("/your/path/to/file", 'r') as f:
        text_list = [line for line in f.readlines() if 'BORDER' not in line]
    

    text_list 将包含您要查找的所有文本行。如果需要,您可以使用 .strip() 删除这些行

    【讨论】:

    • 您也可以在列表理解中剥离该行,但我不知道该剥离会是什么样子。我猜该行可能以'\n' 结尾。
    • 如果我的文件已经在我的 pc 目录之一中,是否“加载”文件更好?
    • “加载”它是什么意思?您可以使用上下文管理器阅读它with open(...) as f
    • 别介意,我搞混了
    猜你喜欢
    • 2017-12-14
    • 1970-01-01
    • 1970-01-01
    • 2020-03-01
    • 1970-01-01
    • 2022-01-13
    • 2012-10-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多