【问题标题】:Python - Extract string from a text file until the first 2 new line spacePython - 从文本文件中提取字符串,直到前 2 个换行符
【发布时间】:2016-01-26 14:23:57
【问题描述】:

我有一个输入文件,而我必须根据 2 个空白新行提取几行。

例如:文本文件如下所示。

1. Sometext
Sometext 
Sometext

2. Sometext
Sometext
Sometext

3. Sometext
Sometext
Sometext

Sometext which is not needed
Sometext which is not needed
Sometext which is not needed

我必须从“1”中提取一个子字符串。对“2”之前的所有人。 以及“2”的第二个子字符串。对“3”之前的所有人。依此类推。我有下面的脚本来获取输出,但它也获取了我不想要的所有“不需要的某些文本”。请看下面的代码:

file_path = open("filename", "r")
content = file_path.read()
size1 = len(content)
start =0
a=1
b=2
end =0
ext =0   

while (start<size):
   if (end !=-1):
   subString = content[content.find(str(a)+".")+0:content.find("\n"+str(b)+".")] 
   print (subString)
   end = content.find(str(b)+".",start)
                print ("\n")
                a = int(a)+1 # increment to find the next start number
                b = int(b)+1 # increment to find the next end number
                start = end+1 # continuing to search the next
            else:
                break

所以,我决定为结束位置找到 2 个连续的空白行,并使用下面的一个,但是没有用。

subString = content[content.find (str(a)+".")+3:content.find("\n\n")]

请帮助,如果您有任何问题,请告诉我。 提前谢谢你。

【问题讨论】:

  • “不需要的某些文本”与其他行有何不同?是在文件末尾还是什么的?
  • 您的样本数据格式是否正确?每行之间似乎有 3 个换行符。
  • @GriMel ..“不需要的某些文本”在 2 个新行之后不以数字开头
  • @glibdud .. 抱歉,我尝试使用 2 个换行符进行格式化,但文本都在一行中。所以我不得不以这种方式编辑它。请将此视为仅用 2 行分隔的示例。
  • 请看我建议的编辑...这是否准确地代表了数据的样子?

标签: python python-3.x


【解决方案1】:

我不确定我是否正确理解了您的问题,但下面是将输出的代码:

['Sometext', 'Sometext', 'Sometext']
['Sometext', 'Sometext', 'Sometext']
['Sometext', 'Sometext', 'Sometext']

根据您问题中的文字。相反,如果您希望 1 到 2 成为这样的整个子字符串:

['1. Sometext\nSometext\nSometext']
['2. Sometext\nSometext\nSometext']
['3. Sometext\nSometext\nSometext']

您应该将 if 语句更改为:

if is_number(i[0]):
            substring = []
            substring.append(i)
            print(substring)

否则你可以使用下面的代码

def is_number(string):
    try:
        float(string)
        return True
    except ValueError:
        return False

with open('testing.txt', 'r') as f:
content = f.read().split('\n\n')
for i in content:
    if is_number(i[0]):
        c = i.split('\n')
        substring = [line[3:] if is_number(line[0]) else line for line in c]
        print(substring)

【讨论】:

  • ..如果我不够清楚,我很抱歉。您的代码工作正常,但仅当行首包含“1”时才有效。我基本上想找到“1”的第一次出现。文件中的任何位置并继续查找最后一个数字(在示例中为“3”,但可以是任何数字)。以 2 条新行结束。我会尝试稍微修改您的代码,看看是否有帮助.. 但如果您能得到它,请告诉我。非常感谢,如果我仍然不清楚,请告诉我。
【解决方案2】:

你必须在最后过滤不需要的行,但这会得到你想要的:

from itertools import groupby
with open("in.txt") as f:
    grps = groupby(f, key=lambda x: bool(x.strip()))
    print([list(v) for k,v in grps if k])

输出:

[['1. Sometext\n', 'Sometext\n', 'Sometext\n'], ['2. Sometext\n', 'Sometext\n', 'Sometext\n'], ['3. Sometext\n', 'Sometext\n', 'Sometext\n'], ['Sometext which is not needed\n', 'Sometext which is not needed\n', 'Sometext which is not needed']]

由于您要保留的所有部分都以数字开头:

from itertools import groupby, takewhile

with open("in.txt") as f:
    grps = groupby(f, key=lambda x: bool(x.strip()))
    print (list(takewhile(lambda x: x[0][0].isdigit(),(list(v) for k,v in grps if k))))

输出:

[['1. Sometext\n', 'Sometext\n', 'Sometext\n'],
 ['2. Sometext\n', 'Sometext\n', 'Sometext\n'],
['3. Sometext\n', 'Sometext\n', 'Sometext\n']]

如果您知道有n 组,您可以分片:

from itertools import groupby, islice
with open("in.txt") as f:
    grps = groupby(f, key=lambda x: bool(x.strip()))
    print (list(islice((list(v) for k,v in grps if k),3)))

输出:

[['1. Sometext\n', 'Sometext\n', 'Sometext\n'],
 ['2. Sometext\n', 'Sometext\n', 'Sometext\n'], 
['3. Sometext\n', 'Sometext\n', 'Sometext\n']]

【讨论】:

  • 谢谢帕德莱克。您的代码有效,但它将完整的文件作为一个值。我需要拆分值(根据示例为 3 个值)。此外,它附加了 \n。我将如何删除它?非常感谢您的帮助
  • @Sanjivi,你确定总是有 3 个部分吗?它也分为三个部分,每个子列表都是一个部分,要删除换行符,我们只需要将它们去掉
  • 对延迟回复表示歉意。不,可以有很多部分。我展示了 3 仅作为示例。是的,每个子列表都是一个由 3 个空白新行分隔的部分。我想将每个子列表提取为单个子字符串并将其提供给我的系统。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-21
相关资源
最近更新 更多