当前位置: 首页 > 面试题库 >

使用特殊的分隔线将文本文件拆分为部分-python

孙财
2023-03-14
问题内容

我有这样的输入文件:

This is a text block start
This is the end

And this is another
with more than one line
and another line.

所需的任务是按由特殊行分隔的部分读取文件,在这种情况下,该行为空行,例如[out]:

[['This is a text block start', 'This is the end'],
['And this is another','with more than one line', 'and another line.']]

通过这样做,我一直在获得所需的输出:

def per_section(it):
    """ Read a file and yield sections using empty line as delimiter """
    section = []
    for line in it:
        if line.strip('\n'):
            section.append(line)
        else:
            yield ''.join(section)
            section = []
    # yield any remaining lines as a section too
    if section:
        yield ''.join(section)

但是,如果特殊行是以#例如以下开头的行:

# Some comments, maybe the title of the following section
This is a text block start
This is the end
# Some other comments and also the title
And this is another
with more than one line
and another line.

我必须这样做:

def per_section(it):
    """ Read a file and yield sections using empty line as delimiter """
    section = []
    for line in it:
        if line[0] != "#":
            section.append(line)
        else:
            yield ''.join(section)
            section = []
    # yield any remaining lines as a section too
    if section:
        yield ''.join(section)

如果我允许per_section()拥有分隔符参数,则可以尝试以下操作:

def per_section(it, delimiter== '\n'):
    """ Read a file and yield sections using empty line as delimiter """
    section = []
    for line in it:
        if line.strip('\n') and delimiter == '\n':
            section.append(line)
        elif delimiter= '\#' and line[0] != "#":
            section.append(line)
        else:
            yield ''.join(section)
            section = []
    # yield any remaining lines as a section too
    if section:
        yield ''.join(section)

但是有没有办法我不对所有可能的分隔符进行硬编码?


问题答案:

传递谓词怎么样?

def per_section(it, is_delimiter=lambda x: x.isspace()):
    ret = []
    for line in it:
        if is_delimiter(line):
            if ret:
                yield ret  # OR  ''.join(ret)
                ret = []
        else:
            ret.append(line.rstrip())  # OR  ret.append(line)
    if ret:
        yield ret

用法:

with open('/path/to/file.txt') as f:
    sections = list(per_section(f))  # default delimiter

with open('/path/to/file.txt.txt') as f:
    sections = list(per_section(f, lambda line: line.startswith('#'))) # comment


 类似资料:
  • 我遇到了Streams的或方法的问题,因为spliterator跳过特定模式(奇数或偶数)的文本部分。应该做什么来处理文本的所有部分?我在这里的方法: 示例输入为: 它将跳过Faysal:2和Faysal:4

  • 我有一个逗号分隔的文件,其中有许多行类似于下面的一行。 引号用于转义用于表示多个值的分隔符逗号。 现在,如果可能的话,如何使用在逗号分隔符上拆分上述值?

  • 问题内容: 我想像这将是一个简单的任务,但在以前的StackOverflow问题中我找不到我正在寻找的东西…… 我有一个专有格式的大文本文件,看起来像这样: 依此类推。 文本文件的大小从10kb到100mb不等。我需要用定界符分割此文件。如何基于块处理每个文件? 问题答案: 您可以使用itertools.groupby对列表中出现的行进行分组: 产量 或者,要处理组,您实际上不需要转换为列表:

  • 我有多个文本文件,大约有100,000行,我想将它们拆分成每个5000行的较小文本文件。 我曾经: 这将创建文件: 没有扩展名的文件。我只是想给他们打个类似的电话: 或者,如果这不可能,我只希望他们有“.txt”扩展名。

  • 我有一个逗号分隔的CSV文件(),其中逗号通过在引号中环绕数据来转义()。 我想通过使用记事本查找任何未包含在双引号()中的逗号,并将其替换为管道,将我的CSV转换为管道分隔文件()。 我的第一种方法是使用正则表达式匹配任何不带引号的逗号。但是,在记事本中搜索会同时替换未加引号的逗号和任何包含逗号的带引号的字符串。 如何使用记事本将逗号分隔的CSV文件()转换为管道分隔的文件()?

  • 问题内容: 我有一个很大的JSON文件,它是对象的对象,我想在对象键之后将其拆分成单独的文件名。是否可以使用jq或任何其他现成的工具来实现此目的? 原始JSON格式如下 鉴于此输入,我想生成文件item1.json,item2.json等。 问题答案: 这应该给您一个开始: 或者当您坚持使用一些较卑鄙的语法时,似乎有些人更喜欢: