2009-07-19 7 views
3

Ich benutze pyodbc um eine AS400 (leider) abzufragen, und einige Spaltennamen haben Hashes in ihnen! Hier ist ein kleines Beispiel:Wie ein Hash (#) char in Python zu entkommen?

self.cursor.execute('select LPPLNM, LPPDR# from BSYDTAD.LADWJLFU') 

for row in self.cursor: 
    p = Patient() 
    p.last = row.LPPLNM 
     p.pcp = row.LPPDR# 

bekomme ich Fehler wie dies offensichtlich:

AttributeError: 'pyodbc.Row' object has no attribute 'LPPDR' 

Gibt es eine Möglichkeit, dies zu entkommen? Scheint zweifelhaft, dass ein Hash auch in einem Variablennamen erlaubt ist. Ich habe Python heute abgeholt, also vergib mir, wenn die Antwort allgemein bekannt ist.

Danke, Pete

Antwort

7

Verwenden Sie die getattr Funktion

p.pcp = getattr(row, "LPPDR#") 

Dies ist in der Regel die Art und Weise, die Sie mit Attributen umgehen, die kein Recht Python Identifikatoren sind. Zum Beispiel können Sie

setattr(p, "&)(@#[email protected]!!~%&", "Hello World!") 
print getattr(p, "&)(@#[email protected]!!~%&") # prints "Hello World!" 

auch sagen, wie JG schon sagt, Sie Ihre Spalten einen Alias ​​geben kann, wie durch

SELECT LPPDR# AS LPPDR ... 
+0

Funktioniert gut, vielen Dank! – slypete

5

sagen können Sie versuchen, die Spalte einen Alias ​​zu geben, das heißt:

self.cursor.execute('select LPPLNM, LPPDR# as LPPDR from BSYDTAD.LADWJLFU') 
2

self.cursor.execute gibt ein Tupel, so würde dies auch funktionieren:

for row in self.cursor: 
     p = Patient() 
     p.last = row[0] 
     p.pcp = row[1] 

Aber ich ziehe die anderen Antworten :-)

1

Die Frage beantwortet wurde, aber das ist nur eine andere Alternative (basierend auf Adam Bernier Antwort + Tupel auspacken), die ich denke, ist die sauberste:

for row in self.cursor: 
    p = Patient() 
    p.last, p.pcp = row 
Verwandte Themen