如何读取python中的特定行?

如何读取python中的特定行?,python,Python,我有一个python应用程序,可以从纯文本中阅读 很好用。我的问题是有一种可能的方法可以从多行而不是逐行阅读。例如,下面是我的纯文本文件color.txt: ### ##### ######### #example colors #line of colors #line colors PART 1 color1 gray color2 blue # line colors PART 2 iface eth1 inet static colo

我有一个python应用程序,可以从纯文本中阅读

很好用。我的问题是有一种可能的方法可以从多行而不是逐行阅读。例如,下面是我的纯文本文件color.txt

###
#####
#########

#example colors
#line of colors
#line colors PART 1
        color1 gray
        color2 blue


# line colors PART 2
iface eth1 inet static
        color1 yellow
        color2 green
我想要“part1”中的color1和color2,所以我逐行阅读,但如果我将color1的位置更改为color2,我会得到一个错误,那么有没有办法阅读“part1”中的所有内容?这样我就可以得到同样的结果

以下是我的完整代码:

from flask import Flask,render_template,flash,request,redirect
import os
import sys
app = Flask(__name__)

def color1_p1():
    with open('color.txt', 'r+') as f:
        for i, line in enumerate(f):
          if i == 7: 
            found_color = line.find('color1')
            if found_color != -1:
               color = line[found_color+len('color1:'):]
               print ('Color: '), color
    return color


def color2_p1():
    with open('color.txt', 'r+') as f:
        for i, line in enumerate(f):
          if i == 8: 
            found_color = line.find('color2')
            if found_color != -1:
               color = line[found_color+len('color2:'):]
               print ('Color: '), color
    return color


def color1_p2():
    with open('color.txt', 'r+') as f:
        for i, line in enumerate(f):
          if i == 13: 
            found_color = line.find('color1')
            if found_color != -1:
               color = line[found_color+len('color1:'):]
               print ('Color: '), color
    return color

def color2_p2():
    with open('color.txt', 'r+') as f:
        for i, line in enumerate(f):
          if i == 14: 
            found_color = line.find('color2')
            if found_color != -1:
               color = line[found_color+len('color2:'):]
               print ('Color: '), color
    return color



@app.route('/')
def showLine():
    color1 = color1_p1()
    color2 = color2_p1()
    color3 =color1_p2()
    color4 = color2_p2()
    return render_template('color.html', color1=color1, color2=color2, color3=color3,color4=color4)

if __name__ == '__main__':
    app.run(debug=True)
正如你所看到的,我是逐行阅读内容的,我想阅读“1”部分的所有内容,我尝试不使用这些行,但这样做时,它会阅读“2”部分或他们找到的第一个“color1和color2”

这是我的输出:

我只想读color1或color2,不管它是哪一行,如果我改变了位置,程序应该读这个,同样的事情也应该发生在第2部分

#!/usr/lib/env python
import re

file = open("color.txt","r")
content = file.read()
file.close()
content = content.split('PART ')[1:]
dic = {}
for part in content:
    dic[int(part[0])] = part[1:]

def color(color_index, part_index):
    color = re.search('color{_color_index}\s(.*?)\s'.format(_color_index=color_index),dic[part_index]).group(1)
    print 'color',color_index,'of PART',part_index,":",color
    return color

color(1,1)#color 1 of PART 1 : gray
color(2,1)#color 2 of PART 1 : blue
color(1,2)#color 1 of PART 2 : yellow
color(2,2)#color 2 of PART 2 : green
这样,无论零件和颜色如何排列,您都可以得到您想要的


这样,无论零件和颜色如何排列,您都可以得到您想要的。

您可以使用正则表达式找到
color1的“模式”
您建议如何做?我认为这不会比您所做的更好。您可以使用正则表达式找到“模式”关于
color1
你建议怎么做?我不认为这会比你做的更好。没有索引1或索引2的情况下,有没有一种可行的方法可以让它工作?例如,在我的纯文本中只有“颜色”一词@如果不关心颜色和部分的索引,可以通过
colors=re.findall('color\d\s(.*s?)\s',open('color.txt','r').read())
获得文本中显示的所有颜色。或者通过
colors=re.findall('color\d\s(.*?\s',dic[零件索引])
找到与零件对应的零件。我认为你最好学习一些正则表达式的基本知识,这对你在文本文件中查找特定字符串非常有帮助。我尝试了
color=re.findall('color\d\s(.*s?)\s',dic[part_index])
,因为我希望它们是按部分的,我通过控制台得到了以下结果
[]
哪个应该是红色的@MaxI使用上面提供的color.txt对其进行测试,并分别获得
['gray'、'blue']
['yellow'、'green']
作为
颜色(1)
颜色(2)
的结果。因此,我认为您当前文本文件的格式可能与您上面提供的格式不同?因为正则表达式“color\d\s(.*)\s”查找的字符串的组织方式与
color\d\sred\s
完全相同,其中
\d
表示数字,
\s
表示空白字符。所以,如果文本格式发生了变化,请确保编写适当的正则表达式来匹配它们。这里有一个链接到
re
lib[@pythonbengineerthanks供您回答!是的,我的结果与您的结果相同,但我的意思是我得到了
['gray','blue']
['yellow','green']
作为
颜色(1)
颜色(2)的结果
。但在第一个答案中,我得到了四种颜色的四种结果,分别是
color(1)
color(2)
color(3)
,最后是
color(4)
。我想打印这样的东西。例如,我想打印
color(1)
而不是打印
['gray','blue']
,我想打印
color(1)
然后得到“灰色”
color(2)
然后得到“蓝色”。这就是我所需要的。可能吗?。顺便说一下,链接不起作用。谢谢..@max有没有一种可能的方法可以让它在没有索引1或索引2的情况下工作?例如,只有“color”这个词在我的纯文本中?@MaxYou可以通过
colors=re.findall('color\d\s(.*)\s',open('color.txt','r').read())
获取文本中出现的所有颜色,如果您不关心颜色和部分的索引。或者通过
colors=re.findall('color\d\s(.?\s',dic[part u index]))
如果你想让它们与部分相对应。我认为你最好学习正则表达式的一些基本知识,这在你想在文本文件中找到特定字符串时非常有帮助。我尝试了
color=re.findall('color\d\s(.*?\s',dic[part\u index])
因为我需要按部件进行测试,所以我通过控制台得到了以下结果
[]
,应该是
红色
?@MaxI使用上面提供的color.txt对其进行测试,并获得
['gray','blue']
['yellow','green']
作为
颜色(1)
颜色(2)的结果
分别。因此,我认为当前文本文件的格式可能与上面提供的格式不同?因为正则表达式的color\d\s(.*)\s'查找完全按照
color\d\sred\s
组织的字符串,其中
\d
表示一个数字,
\s
表示一个空白字符。因此,如果您的文本格式发生更改,请确保编写适当的正则表达式来匹配它们。下面是指向
re
lib文档的链接[@pythonbengineer谢谢你的回答!是的,我的结果和你的一样,但我的意思是我得到了
['gray','blue']
['yellow','green']
作为
color(1)
color(2)
的结果。但是在第一个答案中,我得到了四种颜色,作为
color(1)
color(2)
color(3)
最后是
color(4)
。我想要这样的东西。例如,我想打印
color(1)
而不是得到
['gray','blue']
我想打印
color(1)
然后得到'gray'
color(2)
然后得到“蓝色”。这就是我所需要的。可能吗?顺便说一下,链接不起作用。谢谢..@Max