使用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()