2016-11-09 3 views
0

Ich habe eine App in Python, wo ich aus einem einfachen Text lesen.Wie kann ich von bestimmten Zeilen in Python lesen?

Es funktioniert gut. Meine Frage ist, gibt es eine Möglichkeit, aus mehreren Zeilen statt Zeile für Zeile zu lesen. Zum Beispiel hier ist meine einfache Textdatei 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 

Ich mag color1 und color2 von „Teil1“ so dass ich diese Zeile für Zeile zu lesen, aber wenn ich Position color1 für color2 ändern I‘ bekomme ich einen Fehler, also gibt es eine Möglichkeit, alles innerhalb von "part1" zu lesen? Auf diese Weise kann ich das gleiche Ergebnis erzielen.

Hier ist mein vollständiger Code:

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) 

wie Sie erhalte ich den Inhalt von Linien sehen, ich möchte innerhalb eines Teils, alles lesen „1“ ist, habe ich versucht, ohne die Linien aber, wenn dabei Es liest den "Teil 2" oder die erste "Farbe1 und Farbe2", die sie finden.

Hier ist meine Ausgabe:

Click here!

Alles, was ich will, ist color1 zu lesen oder color2 egal die Linie ist es, wenn ich die Position sollte das Programm liest dies zu ändern, und das gleiche passieren soll in Teil 2.

+0

Sie könnten einen regulären Ausdruck verwenden, um das "Muster" von 'color1' zu finden. –

+0

Wie schlagen Sie vor, das zu tun? –

+0

Ich glaube nicht, dass es besser wäre als das, was Sie getan haben –

Antwort

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 

Auf diese Weise können Sie bekommen, was Sie wollen, egal wie Teile und Farben angeordnet sind.

+0

Gibt es eine Möglichkeit, es ohne den Index 1 oder 2 arbeiten zu lassen? Zum Beispiel mit nur dem Wort "Farbe" in meinem Klartext? @Max –

+0

Sie können alle Farben, die in Ihrem Text erscheinen, mit 'colors = re.findall ('color \ d \ s (. *?) \ S', öffnen ('color.txt', 'r') lesen.)) 'wenn dir der Farb- und Teile-Index egal ist. Oder durch 'colors = re.findall ('farbe \ d \ s (. *?) \ S', dic [teil_index])' wenn du sie passend zu Teilen finden willst. Und ich denke, du solltest etwas grundlegendes Wissen über ** regulären Ausdruck ** lernen, was sehr hilfreich ist, wenn du eine bestimmte Zeichenkette in einer Textdatei finden willst. –

+0

Ich habe versucht 'color = re.findall ('color \ d \ s (. *?) \ S', dic [part_index])' weil ich sie durch Teile haben will und ich habe das folgende Ergebnis von der Konsole '[]' was sollte stattdessen "rot" sein? @Max –

Verwandte Themen