2016-06-04 6 views
0

Ich arbeite an einem Problem, um eine Funktion find_row mit drei Eingabeparameter - Dateiname, col_number und Wert zu erstellen. Ich möchte eine Ausgabe wie in Beispiel gegeben:So finden Sie die Zeilennummer eines bestimmten Werts mit bekannten Spalte Nummer in CSV-Datei durch Python

Zum Beispiel, wenn wir eine Datei a.csv:

1, 1.1, 1.2 
2, 2.1, 2.2 
3 
4, 4.1, 4.2 

dann

print (find_row ('a.csv', 0, 4)) 3 würde,

print (find_row ('a.csv', 2, 2.2)) würde 1 drucken, und

print (find_row ('a.csv', 0, 100)) drucken würde drucken Keiner.

Der Code habe ich versucht, ist:

import csv 

def find_row(filename,col_number,value): 
    var = str(value) 
    coln = str(col_number) 
    o = open(filename, 'r') 
    myData = csv.reader(o) 
    index = 0 
    for row in myData: 
     if row[col_number] == var: 
      return index 
     else : 
      index+=1 

print find_row('a.csv',2,2.2) 

Es wirft Fehler:

File "C:/Users/ROHIT SHARMA/Desktop/1.py", line 17, in find_row 
    if row[col_number] == var: 

    IndexError: list index out of range 

ich den Fehler verstehen jetzt, aber nicht in der Lage, den Code zu verbessern. Irgendwelche Hilfe hier Jungs ??!

Danke.

Antwort

2

In Ihrer CSV-Datei enthält die dritte Zeile nur eine Spalte, daher ist 2 kein gültiger Index.

Als Nebenwirkung ist es sauberer

for index, row in enumerate(myData): 
    if row[col_number] == var: 
     return index 

bearbeiten zu tun: Auch, dass CSV Sie Probleme geben wird. Es kann '2.2' nicht finden, weil es tatsächlich '2.2' zurückgibt. Entfernen Sie beim Lesen die Leerzeichen, oder stellen Sie sicher, dass die CSV-Datei "korrekt" gespeichert ist (keine Leerzeichen zwischen Komma und Inhalt).

Edit2: Wenn Sie eine CSV mit ungleichen Reihen haben muss, wird dies den Trick:

for index, row in enumerate(myData): 
    try: 
     if row[col_number] == var: 
      return index 
    except IndexError: 
     pass 
+0

noch denselben Fehler zu werfen. Und die CSV-Datei hat keine Leerzeichen. Beim Einfügen hier hat es im Beispiel Leerzeichen. –

+0

Ich testete an meinem Ende sowohl in 2.7 und 3.5 und es funktioniert gut für mich. Kannst du deinen aktuellen Code in einen Pastebin schreiben und ich werde es mir ansehen? –