mikrocontroller.net

Forum: PC-Programmierung Python Skript mysql outt to json format


Autor: Skriptanfänger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
ich möchte gerne folgendes Skript zum laufen bringen
#!/usr/bin/python
# -*- coding: utf-8 -*-

import MySQLdb
import sys

try:
    con = MySQLdb.connect('localhost', 'xx', 'xxxx', 'xxxx')
    cur = con.cursor(MySQLdb.cursors.DictCursor)
    cur.execute("SELECT * FROM `PowerSystem`")

    rows = cur.fetchall()

    for row in rows:
        print row["ID"] + "_" + row["solarVoltage"]

except MySQLdb.Error, e:

    print "Error %d: %s" % (e.args[0], e.args[1])
    sys.exit(1)

finally:

    if con:
        con.close()

allerdings kommt immer de Fehler
Traceback (most recent call last):
  File "./mysql.py", line 15, in <module>
    print row["ID"] + "+" + row["solarVoltage"]
TypeError: unsupported operand type(s) for +: 'long' and 'str'


und danach möchte ich die ausgabe im print automatisch in json format

nach dem Format
{
    "1": {
        "solarVoltage": "xxxV"
    }, 
    "2": {
                "solarVoltage": "xxxV"
    }, 
    "3": {
        "solarVoltage": "xxxV"
    }
}


formatieren wie geht das?

Autor: Karl Käfer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Skriptanfänger schrieb:
>
> Traceback (most recent call last):
>   File "./mysql.py", line 15, in <module>
>     print row["ID"] + "+" + row["solarVoltage"]
> TypeError: unsupported operand type(s) for +: 'long' and 'str'
> 

Tja: das eine Datenfeld enthält ein Integer, das andere einen String, 
die kannst Du nicht mit + konkatenieren. Du kannst stattdessen
print '%d+%s'%(row['ID'], row['solarVoltage'])

oder
print str(row['ID']) + '+' + row['solarVoltage']

benutzen.

> und danach möchte ich die ausgabe im print automatisch in json format
>
> nach dem Format
>
>
> {
>     "1": {
>         "solarVoltage": "xxxV"
>     },
>     "2": {
>                 "solarVoltage": "xxxV"
>     },
>     "3": {
>         "solarVoltage": "xxxV"
>     }
> }
> 

Das kannst Du einfach umwandeln:
dumps( { x['ID']: {'solarVoltage': x['solarVoltage'] } for x in rows})

IMHO eleganteres JSON kommt aber vermutlich heraus, wenn Du es so 
machst:
dumps(map(dict, rows))

Autor: Skriptanfänger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie genau???
print json.dumps(map(dict, rows))


funktiniert nicht?

Autor: Kaj (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Skriptanfänger schrieb:
> funktiniert nicht?
Und WAS genau funktioniert nicht?

Autor: Skriptanfänger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dieser Fehler kommt

 File "./mysql.py", line 22                            
    print json.dumps(map(dict, rows))                   
        ^                                               
SyntaxError: invalid syntax

Autor: imonbln (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
was sagt denn  /usr/bin/python --version ?

2.7 oder 3.X, mein verdacht ist da kommt 3.X raus dann ist das invalider 
Code. In den fall /usr/bin/python2 sagen oder besser das print so ändern 
das ist unter python3 gültig ist.

Autor: Skriptanfänger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo
Python 2.7.9

Autor: imonbln (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dann zeig doch mal ein paar Zeilen um die Zeile 22 Rum vor allen 21 und 
davor. Die Syntax sieht erstmals korrekt aus. Vielleicht klammer 
vergessen oder ähnliches ein wenig weiter "oben" im Quelltext

Autor: Skriptanfänger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo
Hier das gesamte Skript

#!/usr/bin/python                                       
# -*- coding: utf-8 -*-                                 
                                                        
import MySQLdb                                          
import sys                                              
import json                                             
                                                        
try:                                                    
    rowes = []                                          
                                                        
    con = MySQLdb.connect('localhost', 'xxxx', 'xxxxxx'$
    cur = con.cursor(MySQLdb.cursors.DictCursor)        
    cur.execute("SELECT * FROM `PowerSystem`")          
                                                        
    rows = cur.fetchall()                               
                                                        
    for row in rows:                                    
        print '%d:%s'%(row['ID'], row['solarVoltage'])  
                                                        
                                                        

print json.dumps(map(dict, rows))                       
                                                        
except MySQLdb.Error, e:                                
                                                        
    print "Error %d: %s" % (e.args[0], e.args[1])       
    sys.exit(1)

Autor: imonbln (Gast)
Datum:

Bewertung
1 lesenswert
nicht lesenswert
Skriptanfänger schrieb:
> try:
> [...]
>     for row in rows:
>         print '%d:%s'%(row['ID'], row['solarVoltage'])
> [...]
> print json.dumps(map(dict, rows))

^^ das print muss auf die höhe des for (4 tabs einrücken) so ist es 
wirklich invalid da es innerhalb des try except ist. und die Einrückung 
tiefe bricht.


> except MySQLdb.Error, e:
>
>     print "Error %d: %s" % (e.args[0], e.args[1])
>     sys.exit(1)

Autor: Skriptanfänger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nächster Fehler

 File "./mysql.py", line 22                            
    print json.dumps(map(dict, rows))                   
                                    ^                   
IndentationError: unindent does not match any outer inde
ntation level

Autor: imonbln (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Skriptanfänger schrieb:
> IndentationError: unindent does not match any outer inde
> ntation level

seufz steht doch da , python gefällt deine Einrückung nicht. Da wir 
wieder nur die Zeile haben. steht das Print exakt in der gleichen Tiefe 
wie das For  und das except in der nächsten Zeile exakt auf der des Try? 
Irgendwie so was wird es sein.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.