2016-07-09 13 views
0

Ich arbeite am Lesen von meiner CSV-Datei mit Python. Aber ich möchte nur bestimmte (letzte gültige) Zeilen aus dem Schwanz in CSV auch lesen, es gibt einen Haken, dass Funktion die gesamte Zeile nur zurückgeben sollte, wenn es gültig ist. Kann mir jemand dabei helfen?Lesen Sie die letzten gültigen Zeilen in CSV mit Python

Unten ist mein CSV-Datei wie folgt aussieht:

Sr.  Add    A  B  C   D 
0 0013A20040D6A141 -308.1 -307.6 -307.7 -154.063  
1 0013A20040DC889A -308.7 -311.7 -311.7 -154.263  
2 0013A20040DC88C3 -310.1 -310.1 -310.2 -154.863  
3 0013A20040D6A141 -308.2 -306.8 -307.7 -153.863  
4 0013A20040DC889A -308.7 -311.4 -311.1 -153.263  
5 0013A20040DC88C3  --  --  --  -- 
6 0013A20040D6A141 -308.7 -308.3 -305.2 -154.663  

und der Code I versuche:

def last_data(address): 
    i = sum(1 for line in open("filename.csv", 'r')) 
    print i # number of lines in csv 
    cache = {} # dict that saved the last data for particular address 
    n = 3 

    with open("filename.csv",'r') as f: 
     q = deque(f, 3) # 3 lines read at the end 
     qp = [''] * n 
     if i +1 >= n: # for checking whether the number of lines greater than number of add. 
      for k in range(n): 

       qp[k] = q[k].split(',') 

       if address == str(qp[k][1]): # check for particular address in row 
        # if the row has data than put it into json object with address as key and nested key as columns 'A', 'B', etc.  
        cache.update({address: {'A':struct.pack('>l',int(float(qp[k][3]) * 10)), 
              'C':struct.pack('>l',int(float(qp[k][4]) * 10)) 
              }}) 

        return cache[address]['A'], cache[address]['C'] 

Für last_data('0013A20040DC88C3') Rückkehr 5. Reihe mit ungültigen Daten, wo ich 2. Reihe zeigen wollen . Kann mir irgendjemand sagen, wie ich das mache?

+0

Wenn der Datensatz nicht wirklich groß ist, würde ich wahrscheinlich Pandas verwenden, es sagen, welche seprator Sie verwenden (Tab?), Geben Missings als „---“ und einfach entfernen sie am Ende –

+0

@ChristianSauer Nein. Es ist eine große CSV-Datei. Ich habe das Trennzeichen mit ', (Komma)' verwendet. Aber hier habe ich mit 'tab' gezeigt. Kannst du mir das Beispiel mit Pandas geben? – abhi1610

+0

vielleicht sollten Sie Ihren Code erklären ... – Julien

Antwort

1

Mit Pandas es würde wie folgt aussehen:

Hinweis: Python 2.7. Code. Ändern Sie den Import für das StringIo in Python3.

import pandas as pd 
from StringIO import StringIO 

input = """Sr.  Add    A  B  C   D 
0 0013A20040D6A141 -308.1 -307.6 -307.7 -154.063  
1 0013A20040DC889A -308.7 -311.7 -311.7 -154.263  
2 0013A20040DC88C3 -310.1 -310.1 -310.2 -154.863  
3 0013A20040D6A141 -308.2 -306.8 -307.7 -153.863  
4 0013A20040DC889A -308.7 -311.4 -311.1 -153.263  
5 0013A20040DC88C3  --  --  --  -- 
6 0013A20040D6A141 -308.7 -308.3 -305.2 -154.663 
""" 

buffer = StringIO(input) 

df = pandas.read_csv(buffer, delim_whitespace=True, na_values=["--"]) 

# you can customize the behaviour here, e.g. how many invalid values are ok per row. 
# see http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.dropna.html 

df = df.dropna() 
+0

Ich habe diesen Code mit Python 2.7 ausgeführt. Es wird folgender Fehler angezeigt: 'NameError: name 'StringIO' ist nicht definiert. ' – abhi1610

+1

@ abhi1610 Ich habe die Importe vergessen, ich habe sie jetzt hinzugefügt –

+0

Danke für den Code. Es entfernt die ungültigen Zeilen in meinem Kontext. Aber wie kann ich die letzten Daten der bestimmten Abfrage für add lesen? – abhi1610

Verwandte Themen