2017-01-16 6 views
1

Ich schreibe ein Python-Modul, wo ich eine .csv-Datei mit 2 Spalten und einer zufälligen Anzahl von Zeilen lesen. Ich gehe dann durch diese Zeilen bis Spalte 1> x. An dieser Stelle brauche ich die Daten aus der aktuellen Zeile und der vorherigen Zeile, um einige Berechnungen durchzuführen.Anzahl der Zeilen aus .csv-Datei

Derzeit verwende ich 'für i in Bereich (Zeilen)', aber jede CSV-Datei wird eine andere Anzahl von Zeilen haben, so dass dies nicht funktioniert.

Der Code kann unten gesehen werden:

mit Arrays
rows = 73 
    for i in range(rows): 

     c_level = Strapping_Table[Tank_Number][i,0] # Current level 
     c_volume = Strapping_Table[Tank_Number][i,1] # Current volume 

     if c_level > level: 

      p_level = Strapping_Table[Tank_Number][i-1,0] # Previous level 
      p_volume = Strapping_Table[Tank_Number][i-1,1] # Previous volume 

      x = level - p_level # Intermediate values 
      if x < 0: 
       x = 0 
      y = c_level - p_level 
      z = c_volume - p_volume 

      volume = p_volume + ((x/y) * z) 

      return volume 

Bei der Wiedergabe um, ich verwendet:

for row in Tank_data: 
    print row[c]  # print column c 
    time.sleep(1) 

Dies geht durch alle Reihen, aber ich kann die vorherigen Zeilen Daten nicht zugreifen mit diese Methode.

Ich habe darüber nachgedacht, vorherige Zeile und aktuelle Zeile in jeder Schleife zu speichern, aber bevor ich das tue, fragte ich mich, ob es eine einfache Möglichkeit gibt, die Anzahl der Zeilen in einem CSV zu erhalten.

+0

Die Indizierung 'Strapping_Table [Tank_Number] [i, 0]' legt nahe, dass Sie dies bereits als 'numpy' Array oder' Pandas' Datenframe geladen haben. '[i, 0]' ist keine Python-Liste oder String-Indizierung. Geben Sie uns weitere Informationen zu diesem 'Strapping_table' -Objekt - type, shape, dtype. Wenn dies bereits geladen ist, ist dies kein 'csv' Problem; es ist Array eins. – hpaulj

+0

Wenn Sie die Daten bereits in ein Array geladen haben, müssen Sie deren Größe nicht erraten. 'arr.shape [0]' ist die Anzahl der 'Zeilen' in einem 2D-Array. Und Sie können diese Berechnung wahrscheinlich ohne eine Schleife durchführen - nur ein paar Array-Operationen. Aber wir brauchen mehr Details. – hpaulj

+0

Entschuldigung, ja, ich wurde verwirrt. Ich habe es bereits mit 'genfromtxt' aus' numpy' in ein Array konvertiert. 'arr.shape [0]' wäre nützlich gewesen, aber ich habe nur die vorherige Zeile und die aktuelle Zeile gleichzeitig gespeichert. Allerdings sollte 'arr.shape' mir bei einigen anderen Modulen helfen, die ich entwickle. Vielen Dank. –

Antwort

1

Speichern Sie die vorherige Linie

with open("myfile.txt", "r") as file: 
    previous_line = next(file) 
    for line in file: 
     print(previous_line, line) 
     previous_line = line 

Oder Sie es mit Generatoren

def prev_curr(file_name): 
    with open(file_name, "r") as file: 
     previous_line = next(file) 
     for line in file: 
      yield previous_line ,line 
      previous_line = line 
# usage 
for prev, curr in prev_curr("myfile"): 
    do_your_thing() 
+0

Ich bin mir nicht sicher, wie Enumerate hier helfen würde. Ich verstehe, dass es im Grunde einen Index für jede Zeile von 0 bis n erstellen wird. Aber wie würde ich diesen Index verwenden, um dann auf die vorherige Zeile zuzugreifen?So: 'current_level = row [0] previous_level = Reihe [i-1] [0]' Ich weiß, dass das nicht funktioniert, aber ich bin mir nicht sicher, wie es funktioniert. Wenn es nicht möglich ist, werde ich den Code ändern, um die aktuelle und vorherige Zeile gleichzeitig zu speichern. Danke –

+0

mein schlechter! Sehen Sie das Update jetzt, ich denke, es ist der einzige gute Weg, es zu tun, weil Python-Iteratoren nur vorwärts gehen. –

+0

Ich habe es getan, indem ich die vorherige Zeile gespeichert habe. Wenn die richtige Zeile erreicht ist, wird die aktuelle Zeile aktualisiert, während die vorherige Zeile unverändert bleibt. Vielen Dank. –

0

Sie sollten enumerate verwenden können.

for i, row in enumerate(tank_data): 
    print row[c], tank_data[i-1][c] 
0

Da die Größe jeder Zeile in der csv unbekannt ist, bis es gelesen hat, müssen Sie einen anfänglichen Durchlauf durch tun, wenn Sie die Anzahl der Zeilen finden mögen, zB:

numberOfRows = (1 for row in file)

Das würde jedoch bedeuten, dass Ihr Code den csv zweimal lesen würde. Wenn er sehr groß ist, möchten Sie vielleicht nicht - die einfache Option, die vorherige Zeile in einer globalen Variablen zu speichern, ist in diesem Fall die beste Option.

Ein alternativer Weg könnte darin bestehen, die Datei einfach einzulesen und sie von z. ein Panda DataFrame (http://pandas.pydata.org/pandas-docs/stable/generated/pandas.read_csv.html) aber wieder könnte dies zu Langsamkeit führen, wenn Ihr CSV zu groß ist.