2017-12-20 4 views
0

ich in einer CSV-Datei in Python lese, die wie folgt aussieht:Lesezeilen aus CSV-Datei Python gegeben me „“ anstelle von ‚‘ (Klassen)

REGION,1910,1920,1930,1940,1950,1960,1970,1980,1990,2000,2010 
Alabama,2138093,2348174,2646248,2832961,3061743,3266740,3444165,3893888,4040587,4447100,4779736 
Alaska,64356,55036,59278,72524,128643,226167,300382,401851,550043,626932,710231 

Mein Problem ist, dass, wenn ich die ersten gelesen Zeile liest es als

REGION,1910,1920,1930,1940,1950,1960,1970,1980,1990,2000,2010 

die an erster Stelle scheint nicht so viel wie ein Problem. Aber ich später für eine Reihe sehe so einen Split die Zeichenfolge in eine Liste

lijst_eerste_regel = self.eerste_regel.split(",") 

und dann für den Index von str aussehen (2010), aber Python scheint dann für ‚2010‘ schauen nicht „2010“. Daher wird es den Index nicht finden.

ich den Code hier posten (es in einer Klasse ist ich dieses Problem habe, nicht sicher, ob das relevant ist oder nicht)

import io 

class Volkstelling: 

    def __init__(self,jaartal,csvb): 
     """ 
     >>> vs2010 = Volkstelling(2010, 'vs_bevolkingsaantal.csv') 
     """ 
     import csv 
     self.jaartal = jaartal 
     self.csvb = csvb 

     self.eerste_regel = next(self.csvb) 

     if str(jaartal) not in self.eerste_regel: 
       raise AssertionError ("geen gegevens beschikbaar") 

    def inwoners(self, regio): 

     lijst_eerste_regel = self.eerste_regel.split(",") 

     plaats_jaartal = lijst_eerste_regel.index(self.jaartal) # here is where the error occurs 

data = """REGION,1910,1920,1930,1940,1950,1960,1970,1980,1990,2000,2010 
Alabama,2138093,2348174,2646248,2832961,3061743,3266740,3444165,3893888,4040587,4447100,4779736 
Alaska,64356,55036,59278,72524,128643,226167,300382,401851,550043,626932,710231""" 
v = Volkstelling('2010',io.StringIO(data)) 
v.inwoners('Alabama') 
## ValueError: '2010' not in list 
+0

'lijst_eerste_regel.index (str (self.jaartal))'? Sie konvertieren es nur lokal in '__init__', nicht in' inwoners'. Oder konvertieren Sie die Daten nach der Teilung, z. Verwenden eines Listenverständnisses 'list_eerste_regel = [int (s) für s in self.eerste_regel.split (". ")]'. – jonrsharpe

+0

lijst_eerste_regel.index (str (self.jaartal)) das habe ich selbst versucht aber dann sucht es nach "2010" statt nach "2010". Die zweite Option bekomme ich nicht ganz. Ich gebe das nach lijst_eerste_regel = self.eerste_regel.split (",") oder statt dessen ein? –

+0

''2010' ==" 2010 "'. Statt dessen enthält es * den Split. – jonrsharpe

Antwort

0

Ihr Code zu 2010 führen einige Probleme hatten, nicht gefunden werden:

  1. Wenn Sie Dateien eingelesen, hat jede Zeile ein newline character, die gemeinhin als \n dargestellt, am Ende. Fügen Sie den folgenden Code in Ihre inwoners Funktion der Zeilenende-Marke hinter 2010 zu sehen:

    print(lijst_eerste_regel)

    Sie können Leerzeichen und Zeilenumbrüche entfernen mit der Python-Funktion 'SOME STRING'.strip()

  2. Ihre Funktion nicht geben einen Wert zurück, so Sie erhalten None von inwoners auch wenn es korrekt ausgeführt würde.

Das folgende Beispiel funktioniert:

import io 

class Volkstelling: 

    def __init__(self,jaartal,csvb): 
     """ 
     >>> vs2010 = Volkstelling(2010, 'vs_bevolkingsaantal.csv') 
     """ 
     import csv 
     self.jaartal = jaartal 
     self.csvb = csvb 

     self.eerste_regel = next(self.csvb) 

     if str(jaartal) not in self.eerste_regel: 
       raise AssertionError ("geen gegevens beschikbaar") 

    def inwoners(self, regio): 

     lijst_eerste_regel = [s.strip() for s in self.eerste_regel.split(",")] 
     plaats_jaartal = lijst_eerste_regel.index(self.jaartal) 

     return plaats_jaartal # Returns the column index where to find the no of inhabitants 

data = """REGION,1910,1920,1930,1940,1950,1960,1970,1980,1990,2000,2010 
Alabama,2138093,2348174,2646248,2832961,3061743,3266740,3444165,3893888,4040587,4447100,4779736 
Alaska,64356,55036,59278,72524,128643,226167,300382,401851,550043,626932,710231""" 

v2 = Volkstelling('1920',io.StringIO(data)) 
print(v2.inwoners('Alabama')) 
## -> prints 2 
v1 = Volkstelling('2010',io.StringIO(data)) 
print(v1.inwoners('Alabama')) 
## -> prints 11 
+0

Es gibt keine Rückkehr, weil meine Funktion dort noch nicht endet (ich weiß, ich hätte es sowieso enthalten) leider funktioniert die Funktion immer noch nicht mit mir ... Nur um zu erwähnen wenn ich zB nachschaue für 1920 habe ich das gleiche Problem. Soweit ich weiß, ist das nicht das Ende der Zeile, so dass das Problem von "\ n" kann nicht dort auftreten –

+0

Ich weiß nicht, was Sie mit "nicht funktioniert". Bearbeiten Sie Ihre Frage, um die Änderungen zu reflektieren Sie haben gemacht, und beschreiben, welche Ausgabe Sie erwarten und was Sie bekommen .. Siehe http://idownvotedbecau.se/itsnotworking/ – akraf

+0

Ich werde und der Fehler, den ich bekomme ist ValueError: 2010 ist nicht in der Liste –

Verwandte Themen