2017-02-13 2 views
0

OK, das ist wahrscheinlich ziemlich einfach, aber ich bin noch sehr neu bei Python. Ich schätze die Hilfe.Python: Wie man eine Textdatei nach einer Zeichenkette sucht und dann auf das zugreift, was danach geschrieben wird

Ich versuche, mein Programm auf eine Textdatei zugreifen, die von der Befehlszeile angezeigt wird, die einige Float-Daten enthält, die auf einer Zeile aber einem verwandten Jahr vorausgehen.

Zum Beispiel:

2010 
11 21.5 18 15.2 13 17 14 0 10 16 8.6 5 
2013 
10.6 14.5 17.9 11.2 1.5 1.9 16 2.2 10 5.2 4.6 5 

Ich mag ein Jahr den Benutzer zur Eingabe fragen, und dann, wenn das Jahr in der Textdatei gefunden wird, die entsprechenden Daten für jeden Monat drucken.

Ich kann nicht scheinen, dass dies funktioniert.

Derzeit wird das Programm für das Jahr überprüfen, und wenn es nicht gefunden wird, wird es sagen, und fragen Sie erneut, aber wenn es gefunden wird, wird es einfach sofort erneut fragen.

Dies ist eine Ordnung gebracht Version des Teils meines Codes:

f = open(sys.argv[1]) 

months = ['January', 'February', ...] 

while True: 
    f.seek(0) 
    os.system('cls') 
    year = input("Enter year for which you want rainfall data: ") 
    line = f.readline().strip() 
    while line and line != year: 
     line = f.readline().strip() 

    if not line: 
     print("No rainfall data found for year {}".format(year)) 
     input("Press Enter to continue ...") 
     response = input("Do it again for another year? [[y]/n] ") 
     if response == "n": 
      break 

    else: 
     rain_line = f.readline() 
     rain_line = rain_line.strip() 
     rain_line = rain_line.split() 
     rain_strings = list(rain_line) 
     rain_numbers = [] 
     for rain in rain_strings: 
      rain_numbers.append(rain) 

    print("in {}, {} Millimeters.".format(months[1], rain_numbers[1])) 

Anybody sehen, wenn ich nahe bin oder weg?

Ich habe seit Stunden herumspielen.

Antwort

0

Betrachte es nicht als eine Zeile und die nächste Zeile, betrachte sie als Paare. Mit diesem pairwise iterator:

def parse_rainfall(f): 
    for year, data in pairwise(f): 
     # ... 
0

für Ihren Code, ist das Problem auf dem Zustand des während Ausdrucks while line and line != year:.

Wenn Sie Eingabe wie 2010 für year = input("Enter year for which you want rainfall data: "), wird es zu int Art analysiert werden, und wird nie gleich der line, die eine Zeichenfolge ist. Verwenden Sie eine Konvertierung str(year) wird das Problem beheben.

Aber Sie können eine andere Methode sowohl für die Effizienz und Codierung verwenden möchten.

Wenn die Datei nicht sehr groß ist, versuchen Sie, die Datei zuerst zu analysieren und in ein Python-Wörterbuch wie {2010: [11 21.5 18 15.2 13 17 14 0 10 16 8.6 5], ...} zu verwandeln. Dann können Sie das Wörterbuch einfach abfragen, indem Sie das Jahr als Schlüssel verwenden und seine Daten abrufen.

Wenn die Datei groß ist, sollten Sie sie analysieren und in eine Datenbank schreiben, entweder SQL oder NoSQL, dann wird die Abfrage so einfach wie ein Python-Wörterbuch.

0

Andernfalls können Sie ändern, wie Sie in Ihrer Textdatei suchen und eine Lösung wie diese verwenden (ich habe es nicht mit einer großen Datei getestet. Bitte lassen Sie mich wissen, wenn es damit bricht).

Ich bin Ihre Eingabedatei unter der Annahme input_file genannt:

def get_data(): 
    data = list(k.rstrip() for k in open("input_file", 'r')) 
    d = list(data[k:k+2] for k in range(0,len(data),2)) 
    final = [] 
    while True: 
     user_data = input("Enter a year: ") 
     if user_data == 'q': 
      break 
     for k in d: 
      if k[0] == user_data: 
       final.append(k[1]) 

     if final != '': 
      print("\n".join(final)) 
      final = [] 
     else: 
      print("Cannot find any data for the year:", user_data) 


get_data() 

Demo:

Enter a year: 2010 
11 21.5 18 15.2 13 17 14 0 10 16 8.6 5 
Enter a year: 2013 
10.6 14.5 17.9 11.2 1.5 1.9 16 2.2 10 5.2 4.6 5 
Enter a year: 2000 
Cannot find any data for the year: 2000 
Enter a year: 2010 
11 21.5 18 15.2 13 17 14 0 10 16 8.6 5 
Enter a year: 2100 
Cannot find any data for the year: 2100 
Enter a year: 22 
Cannot find any data for the year: 22 
Enter a year: q 
Verwandte Themen