使用python提取文本文件中两个字符串之间的值

使用python提取文本文件中两个字符串之间的值,python,Python,假设我有一个包含以下内容的文本文件 fdsjhgjhg fdshkjhk Start Good Morning Hello World End dashjkhjk dsfjkhk 现在我需要编写一个Python代码,它将读取文本文件并将开始和结束之间的内容复制到另一个文件 我编写了以下代码 inFile = open("data.txt") outFile = open("result.txt", "w") buffer = [] keepCurrentSet = True for line

假设我有一个包含以下内容的文本文件

fdsjhgjhg
fdshkjhk
Start
Good Morning
Hello World
End
dashjkhjk
dsfjkhk
现在我需要编写一个Python代码,它将读取文本文件并将开始和结束之间的内容复制到另一个文件

我编写了以下代码

inFile = open("data.txt")
outFile = open("result.txt", "w")
buffer = []
keepCurrentSet = True
for line in inFile:
    buffer.append(line)
    if line.startswith("Start"):
        #---- starts a new data set
        if keepCurrentSet:
            outFile.write("".join(buffer))
        #now reset our state
        keepCurrentSet = False
        buffer = []
    elif line.startswith("End"):
        keepCurrentSet = True
inFile.close()
outFile.close()
我没有得到预期的输出 我才刚刚开始 我想要的是开始和结束之间的所有线条。
不包括开始和结束。

如果文本文件中有多个“开始”和“结束”,这将一起导入所有数据,不包括所有“开始”和“结束”


我不是Python专家,但这段代码应该可以完成这项工作

inFile = open("data.txt")
outFile = open("result.txt", "w")
keepCurrentSet = False
for line in inFile:
    if line.startswith("End"):
        keepCurrentSet = False

    if keepCurrentSet:
        outFile.write(line)

    if line.startswith("Start"):
        keepCurrentSet = True
inFile.close()
outFile.close()

如果文本文件不一定很大,则可以获取文件的全部内容,然后使用正则表达式:

import re
with open('data.txt') as myfile:
    content = myfile.read()

text = re.search(r'Start\n.*?End', content, re.DOTALL).group()
with open("result.txt", "w") as myfile2:
    myfile2.write(text)

移出文件。将
调用写入第二个
如果

inFile = open("data.txt")
outFile = open("result.txt", "w")
buffer = []
for line in inFile:
    if line.startswith("Start"):
        buffer = ['']
    elif line.startswith("End"):
        outFile.write("".join(buffer))
        buffer = []
    elif buffer:
        buffer.append(line)
inFile.close()
outFile.close()
使用,:

更新:正如inspectorG4dget评论的那样,上面的代码复制到第一个块上。要复制多个块,请使用以下命令:

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))
重新导入
infle=open(“data.txt”)
outFile=open(“result.txt”、“w”)
buffer1=“”
keepCurrentSet=True
对于填充中的线:
buffer1=buffer1+(行)

buffer1=re.findall(r)(?我会这样处理它:

inFile = open("data.txt")
outFile = open("result.txt", "w")

data = inFile.readlines()

outFile.write("".join(data[data.index('Start\n')+1:data.index('End\n')]))
inFile.close()
outFile.close()

这些文本文件很大吗?有两个问题:(1)
\n
不跨平台-Windows使用
\r\n
(2)这根本不处理多个块-它只复制第一个块block@inspectorG4dget,谢谢你的commnet。我更新了答案。对于这个问题,Regex的技巧太过火了。另外,你不处理其中一行是
Ender的游戏
(Regex中的
结尾需要换行)。此外,
\n
的使用不是跨平台的,因为windows将
\r\n
用于endings@inspectorG4dget根据我的经验,正则表达式从来都不过分。如果你精通方言,它会有可预测的行为。使用它们有助于保持你的技能,这是很好的,因为它们足够强大,可以使用几乎每一个文本操作都会被删除。不过,你的答案是优雅的,摇滚乐+1。在最坏的情况下,内存的使用效率非常低,而且不会处理多个块。如果文件中有开头很棒的句子的行
安德的游戏
,这将失败,谢谢你的回答。我在真实场景中也应用了同样的回答rio,我得到了以下错误D:\Python>Python.exe First.py回溯(最近一次调用是最后一次):文件“First.py”,第3行,在infle中的行中:文件“D:\Python\lib\encodings\cp1252.py”,第23行,在decode return codecs.charmap\u decode(输入,self.errors,decoding\u table)[0]UnicodeDecodeError:“charmap”编解码器无法解码位置4591处的字节0x81:Charter映射到您能帮我解决吗this@user2790219:这不是此代码的错误。如果您可以发布您正在使用的文本文件,可能有人可以提供帮助(我认为您应该提出一个新问题)此代码将不包括字符串“Start”和“End”“就是它们里面的内容。你会如何包含周界字符串?@johnnydrama:只需添加
输出文件。在前两个if块中也写入
行,这是一个很好的观察结果。但是,呈现的代码意味着从“开始”和“结束”的多个实例中获取所有数据。”.我已经更新了我的答案,明确说明了这个假设
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))
import re

inFile = open("data.txt")
outFile = open("result.txt", "w")
buffer1 = ""
keepCurrentSet = True
for line in inFile:
    buffer1=buffer1+(line)

buffer1=re.findall(r"(?<=Start) (.*?) (?=End)", buffer1)  
outFile.write("".join(buffer1))  
inFile.close()
outFile.close()
inFile = open("data.txt")
outFile = open("result.txt", "w")

data = inFile.readlines()

outFile.write("".join(data[data.index('Start\n')+1:data.index('End\n')]))
inFile.close()
outFile.close()