2016-07-20 39 views
1

Ich habe online gesucht, um zu versuchen, dieses Problem zu lösen und verwendete Lösungen aus anderen Posts zu meiner Lösung zu bauen, aber von hier bekomme ich nicht was als nächstes tun.Python - Durchschnitt von n Zeilen in einer txt-Datei

Ich möchte im Grunde die letzten 5 Zeilen der PastWinners Textdatei und dann den Durchschnitt dieser Zahlen erhalten. Was ich momentan habe, bekommt den Durchschnitt des gesamten Dokuments und druckt auch die letzte Zeile in der Textdatei aus.

with open('PastWinners.txt') as f: 
    data = [float(line.rstrip()) for line in f] 

    first = f.readline()  # Read the first line. 
    f.seek(-2, 2)    # Jump to the second last byte. 
    while f.read(1) != b"\n": # Until EOL is found... 
     f.seek(-2, 1)   # ...jump back the read byte plus one more. 
    last = f.readline()  # Read last line. 

biggest = min(data) 
smallest = max(data) 
print(sum(data)/len(data)) 
print(last) 

Danke für die Hilfe.

+0

Sobald Sie f durchlaufen haben, rufen Aufrufe von 'readline'' None' zurück. – Alex

+0

Wie werden die Daten in die Datei geschrieben? ein Wert pro Zeile? – Gianluca

Antwort

2

können Sie slicing verwenden nur die 5 letzten Zahlen zu erhalten (ich alle irrelevanten Code gelöscht):

with open('PastWinners.txt') as f: 
    data = [float(line.rstrip()) for line in f] 
print(sum(data[-5:])/len(data[-5:])) 

die data[-5:] sagt nur die Daten aus dem 5-1 vor dem letzten Punkt zum letzten Punkt nehmen .

+0

Danke, funktioniert perfekt. Nur eine Nebensache, wäre es möglich, die print-Anweisung nur bis zu 2dp anzeigen zu lassen? –

+0

Sicher. Ändere die letzte Zeile in: 'print (" {0: 0.2f} ". Format (Summe (Daten [-5:])/len (Daten [-5:]))) ' –

1

Sie können die Datei in umgekehrter Reihenfolge lesen und break nach 5 Lesevorgänge verwenden, um aus der Schleife herauszukommen. Sie können auch nur 5 Iterationen der Schleife ausführen, während Sie am Ende der Datei beginnen, so dass Sie break überhaupt nicht verwenden müssen.

Here ist, wie in Python umgekehrt zu lesen.

0

Dies funktioniert, wenn die Datei auch weniger als 5 Zeilen enthält und formatiert den Durchschnitt auf 2 Dezimalstellen.

with open('PastWinners.txt') as f: 
    data = [float(line.rstrip()) for line in f] 

if len(data) > 5: 
    data = data[-5:] 

print min(data), max(data), "{:.2f}".format(sum(data)/len(data))