sqlite neue Tabelle in Datenbank erzeugen

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Ich hatte Dir doch schon in einem anderen Thread das ``csv``-Modul für das Parsen der Daten und den ``INSERT``-Befehl von SQL genannt. Wo hakt es denn da jetzt noch? :K

Kleiner Tipp noch: Man probiert Queries nicht über ein Python-Script aus! Man nutzt dafür eine gute SQL-Shell. Für SQLite kann ich Dir ein Fireforx Plugin "SQLite Manager" empfehlen. Wenn Du Linux nutzt, dann ist der Sqliteman exzellent.
Alternativ natürlich sonst noch die CLI-Shell.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Padidem
User
Beiträge: 63
Registriert: Donnerstag 8. Januar 2015, 14:52

wie verbinde ich den INSERT Befehl mit dem csv Modul?
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Auf Seiten der DB-API 2.0 gibt es die Methode executemany. Damit kannst Du effizient viele Datensätze auf einmal in die DB pumpen. Wie in der Doku beschrieben, musst Du ein Iterable mit den Daten übergeben. Dieses liefert Dir das ``csv``-Modul... es sollte also nicht so schwierig sein, das zu realisieren ;-)

(Am besten erstellst Du *zwei* Funktionen! Eine liefert Dir die Daten aus der CSV-Datei und die andere fführt die ``executemany``-Methode aus und bekommt als Parameter ein Iterable übergeben. Auf diese Weise kannst Du jede Funktion *unabhängig* voneinander für sich testen, bevor Du sie dann im Hauptprogramm kombinierst)
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Padidem
User
Beiträge: 63
Registriert: Donnerstag 8. Januar 2015, 14:52

ist das in etwa dieses Iterable?

Code: Alles auswählen

with open('armutsgefahr.txt', 'rb') as csvfile:
    spamreader = csv.reader(csvfile, delimiter=' ', quotechar='|')
    for row in spamreader:
        print ', '.join(row)
sry übrigens falls ich so langsam nerve aber bin grad komplett durcheinander
Zuletzt geändert von Hyperion am Sonntag 11. Januar 2015, 15:37, insgesamt 1-mal geändert.
Grund: Code in Python-Code Tags gesetzt
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Bitte formatiere doch Dein Code-Schnipsel mit den dafür vorgesehen Tags! Auch das wurde Dir jetzt schon mehrfach gesagt. So kann man das doch gar nicht sauber lesen, weil die Einrückungen verloren gehen...

In dem Schnipsel ist der Name ``spamreader`` an ein Iterable gebunden (das erkennst Du einfach daran, dass Du eine ``for``-Schleife einsetzen kannst ;-) )
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Padidem
User
Beiträge: 63
Registriert: Donnerstag 8. Januar 2015, 14:52

Könnte mir auch hier jemand eventuell eine Musterlösung präsentieren

Wäre echt klasse :)
Padidem
User
Beiträge: 63
Registriert: Donnerstag 8. Januar 2015, 14:52

kann ich mir die Daten der txt Datei auch als Liste über csv ausgeben lassen?
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Äh... klar! Die Built-in Funktion ``list`` ist dabei Dein Freund :-)
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Padidem
User
Beiträge: 63
Registriert: Donnerstag 8. Januar 2015, 14:52

wenn ich meine text datei als csv öffne:

Code: Alles auswählen

reader = csv.reader(open("armutsgefahr.txt", "rb"), delimiter=";")

      for row in reader: 
     ...:         print row

sieht das Output folgendermaßen aus:

Code: Alles auswählen

['Bundesland\t2005\t2006\t2007\t2008\t2009\t2010\t2011\t2012\t2013']
['Deutschland\t14.7\t14.0\t14.3\t14.4\t14.6\t14.5\t15.0\t15.0\t15.5']
['Altes Bundesgebiet ohne Berlin\t13.2\t12.7\t12.9\t13.1\t13.3\t13.3\t13.8\t13.9\t14.4']
['Neue Bundeslaender mit Berlin\t20.4\t19.2\t19.5\t19.5\t19.5\t19.0\t19.4\t19.6\t19.8']
['Baden-Wuerttemberg\t10.6\t10.1\t10.0\t10.2\t10.9\t11.0\t11.1\t11.1\t11.4']
['Bayern\t11.4\t10.9\t11.0\t10.8\t11.1\t10.8\t11.1\t11.0\t11.3']
['Berlin\t19.7\t17.0\t17.5\t18.7\t19.0\t19.2\t20.6\t20.8\t21.4']
['Brandenburg\t19.2\t18.9\t17.5\t16.8\t16.7\t16.3\t16.8\t18.1\t17.7']
['Bremen\t22.3\t20.4\t19.1\t22.2\t20.1\t21.1\t22.0\t22.9\t24.6']
['Hamburg\t15.7\t14.3\t14.1\t13.1\t14.0\t13.3\t14.7\t14.8\t16.9']
['Hessen\t12.7\t12.0\t12.0\t12.7\t12.4\t12.1\t12.8\t13.3\t13.7']
['Mecklenburg-Vorpommern\t24.1\t22.9\t24.3\t24.0\t23.1\t22.4\t22.1\t22.8\t23.6']
['Niedersachsen\t15.5\t15.3\t15.5\t15.8\t15.3\t15.3\t15.5\t15.7\t16.1']
['Nordrhein-Westfalen\t14.4\t13.9\t14.6\t14.7\t15.2\t15.4\t16.4\t16.3\t17.1']
['Rheinland-Pfalz\t14.2\t13.2\t13.5\t14.5\t14.2\t14.8\t15.1\t14.6\t15.4']
['Saarland\t15.5\t16.0\t16.8\t15.8\t16.0\t14.3\t15.2\t15.4\t17.1']
['Sachsen\t19.2\t18.5\t19.6\t19.0\t19.5\t19.4\t19.5\t18.8\t18.8']
['Sachsen-Anhalt\t22.4\t21.6\t21.5\t22.1\t21.8\t19.8\t20.6\t21.1\t20.9']
['Schleswig-Holstein\t13.3\t12.0\t12.5\t13.1\t14.0\t13.8\t13.6\t13.8\t14.0']
['Thueringen\t19.9\t19.0\t18.9\t18.5\t18.1\t17.6\t16.7\t16.8\t18.0']


hab ich da was falsch gemacht?? Ich möchte es doch als eine Liste von Tupeln ausgegeben haben :roll:
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Hast Du Dir die Original Datei mal genau angeguckt? Das "\t" steht als Escape-Sequenz für einen Tabulator... ich vermute mal das Trennzeichen ist eben ein solches und kein Semikolon, wie Du es spezifizierst...

Heijeijei... :twisted:
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Padidem
User
Beiträge: 63
Registriert: Donnerstag 8. Januar 2015, 14:52

super, vielen Dank.

Code: Alles auswählen

reader = csv.reader(open("armutsgefahr.txt", "rb"), delimiter="\t")

for row in reader:
    print row
    
['Bundesland', '2005', '2006', '2007', '2008', '2009', '2010', '2011', '2012', '2013']
['Deutschland', '14.7', '14.0', '14.3', '14.4', '14.6', '14.5', '15.0', '15.0', '15.5']
['Altes Bundesgebiet ohne Berlin', '13.2', '12.7', '12.9', '13.1', '13.3', '13.3', '13.8', '13.9', '14.4']
['Neue Bundeslaender mit Berlin', '20.4', '19.2', '19.5', '19.5', '19.5', '19.0', '19.4', '19.6', '19.8']
['Baden-Wuerttemberg', '10.6', '10.1', '10.0', '10.2', '10.9', '11.0', '11.1', '11.1', '11.4']
['Bayern', '11.4', '10.9', '11.0', '10.8', '11.1', '10.8', '11.1', '11.0', '11.3']
['Berlin', '19.7', '17.0', '17.5', '18.7', '19.0', '19.2', '20.6', '20.8', '21.4']
['Brandenburg', '19.2', '18.9', '17.5', '16.8', '16.7', '16.3', '16.8', '18.1', '17.7']
['Bremen', '22.3', '20.4', '19.1', '22.2', '20.1', '21.1', '22.0', '22.9', '24.6']
['Hamburg', '15.7', '14.3', '14.1', '13.1', '14.0', '13.3', '14.7', '14.8', '16.9']
['Hessen', '12.7', '12.0', '12.0', '12.7', '12.4', '12.1', '12.8', '13.3', '13.7']
['Mecklenburg-Vorpommern', '24.1', '22.9', '24.3', '24.0', '23.1', '22.4', '22.1', '22.8', '23.6']
['Niedersachsen', '15.5', '15.3', '15.5', '15.8', '15.3', '15.3', '15.5', '15.7', '16.1']
['Nordrhein-Westfalen', '14.4', '13.9', '14.6', '14.7', '15.2', '15.4', '16.4', '16.3', '17.1']
['Rheinland-Pfalz', '14.2', '13.2', '13.5', '14.5', '14.2', '14.8', '15.1', '14.6', '15.4']
['Saarland', '15.5', '16.0', '16.8', '15.8', '16.0', '14.3', '15.2', '15.4', '17.1']
['Sachsen', '19.2', '18.5', '19.6', '19.0', '19.5', '19.4', '19.5', '18.8', '18.8']
['Sachsen-Anhalt', '22.4', '21.6', '21.5', '22.1', '21.8', '19.8', '20.6', '21.1', '20.9']
['Schleswig-Holstein', '13.3', '12.0', '12.5', '13.1', '14.0', '13.8', '13.6', '13.8', '14.0']
['Thueringen', '19.9', '19.0', '18.9', '18.5', '18.1', '17.6', '16.7', '16.8', '18.0']

row [1]
Out[171]: '19.9'
und warum bekomme ich nur Werte der untersten Liste ausgegeben?
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Ich verstehe nicht, was Du meinst bzw. wissen willst!
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Padidem
User
Beiträge: 63
Registriert: Donnerstag 8. Januar 2015, 14:52

also wie kann in nur z.b. die Zeile von 'Brandenburg' abfragen?
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Der übliche Weg... Du iterierst über die Zeilen und prüfst, ob der String "Brandenburg" im ersten Listenelement der aktuellen Zeile steht...

Wirklich, das sind *absolute* Basics! Wenn die fehlen, wirst Du niemals diese Aufgaben schafffen! Arbeite endlich das Tutorial durch. Da werden alle solche trivialen Dinge besprochen!

In welchem Kontext musst Du das eigentlich machen? Habt ihr keine Grundlagen vorher gelernt? Das passt alles hinten und vorne nicht zusammen...
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Padidem
User
Beiträge: 63
Registriert: Donnerstag 8. Januar 2015, 14:52

ok... aber wie soll ich das jetzt in meine generierte Tabelle armutsgefahr mit den 3 Spalten 'Land' 'Jahr', 'Quote' übertragen??

Bin iwie total verwirrt weil das Format des csv so seltsam ist:

Das Jahr soll ja eine Spalte werden aber in der csv datei ist es eigentlich eine Zeile ?! :cry:
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Das ist doch gar nicht so schwer! Das Umwandeln von Datenstrukturen der Form A in Form B kommt oft vor!

Ich erkläre Dir jetzt mal das Vorgehen *ohne* Code. Das musst Du schon selber umsetzen ;-)

Du schaust Dir erst einmal die *erste* Zeile an. Dann merkst Du, dass darin eine Liste Spaltennamen enthalten ist. Diese Zeile musst Du Dir separat merken, weil Du ja später immer einen Zahlenwert auf ein Jahr abbilden musst. Und die Info, welche Jahre es gibt, steht eben nur in der ersten Zeile.
- merke Dir die Jahre in einer neuen Liste

Danach schaust Du Dir erst einmal *eine* weitere Zeile an. In dieser steht in 0. Position das Land. Dies ist immer fix. Danach stehen für jedes Jahr eben die Werte drin. D.h. Index 1 der Datenzeile entspricht dem 0. Index Deiner Jahresliste, Index 2 der Datenzeile dem 1. Index der Jahresliste usw. Du musst also alle Jahre durchgehen und Dir aus der Jahresliste das *zugehörige* Jahr holen.

Algorithisch für *eben diese eine* Zeile könntest Du nun so vorgehen:
- Lege ein Funktion an, die als Argument eine Zeile mit Daten und die Jahresliste entgegen nimmt.
- Lege eine leere Ergebnis-Liste an
- Gehe die Zeile ab Position *1* bis zum Ende durch (``for``-Schleife ab Index 1 -> wurde Dir schon gezeigt). Nutze dafür ``enumerate``, um Dir zusätzlich zur Quote einen Index zu erzeugen.
- Füege dieser Ergebnis-Liste jeweils eine Liste hinzu, die folgendermaßen aufgebaut ist:
-- 0.-Eintrag der Zeile (eben das Land; ist für jeden Durchlauf der Schleife identisch)
-- Das Jahr aus der Jahresliste mit dem generierten Index der for-Schleife
-- Die Quote
- Gebe die Ergebnisliste zurück. Diese hat also als Werte Listen mit jeweils drei Einträgen!

Nun könntest Du das für eine Zeile (die Du einfach mal zum Testen *manuell* in die Funktion reingibst) testen.

Anschließend musst Du ja nur noch eine Schleife über *alle* Zeilen (außer natürlich der Kopfzeile, die man zunächst separat behandeln muss) schreiben, die diese Funktion aufruft und das Ergebnis an eine Ergebnisliste anhängt. (nutze ```+`` oder ``extend`` auf einer Liste)

So... ist das so schwer vom Prinzip?
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
jerch
User
Beiträge: 1669
Registriert: Mittwoch 4. März 2009, 14:19

Padidem hat geschrieben:ok... aber wie soll ich das jetzt in meine generierte Tabelle armutsgefahr mit den 3 Spalten 'Land' 'Jahr', 'Quote' übertragen??
So, dass möglichst keine Daten verloren gehen. Die csv-Tabelle ist 2-dimensional - Du fragst jetzt nicht ernsthaft, wie die Daten eindimensional darstellbar sind, oder?
Padidem
User
Beiträge: 63
Registriert: Donnerstag 8. Januar 2015, 14:52

@ Hyperion: kannst du mir nicht doch den Code dazu geben?
Ich verstehe zwar deine Anweisungen und sie klingen auch schlüssig aber ich kann sie irgendwie nicht umsetzen (glaube ich bin zu doof :roll: )
Würde deinen Code innerhalb meiner Ausarbeitung natürlich zitieren.


Du würdest mir sehr damit helfen
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Sorry, aber dafür ist mir meine Freizeit zu schade... ich habe schlicht keine Lust dazu, denn es ist (für mich) nicht fordernd und interessant.

Aber mal ehrlich: *Woran* scheiterst Du denn dabei? Eigentlich habe ich das doch recht kleinschrittig aufgeschrieben. Man muss ja mehr oder minder nur ein wenig mit ``for``-Schleifen, ein wenig Slicing und Zuweisungen an Listen (append und extend) arbeiten. Auch für einen Anfänger sehe ich da jetzt nicht so das Problem! :K

Du musst das wirklich *Schritt für Schritt* versuchen umzusetzen! Am besten vollziehst Du das erst einmal *ohne* Python einfach mit einer gegebenen Tabelle der Query und dann einem Zettel und Stift auf Karopapier nach. Schreibe Dir halt für jeden Durchlauf alle Werte auf. Ich denke dann siehst Du doch anschaulich, wie das algorithmisch läuft.

Danach musst Du einfach jeden *kleinen* Schritt in Python kodieren. Also z.B. eine Zuweisung hinschreiben, oder eine ``for``-Schleife usw. Da können ja keine *großen* Probleme auftreten!

Mich würde ja nach wie vor brennend interessiern, in welchem *Kontext* Du das erledigen musst. Ich hoffe mal nicht als irgend ein $Informatiker‽

Kopf hoch, das kannst Du bestimmt! Du musst Dir nur die Zeit nehmen, Dinge im Tutorial aufzuarbeiten! Insbesondere das Arbeiten mit Listen und Schleifen scheinst Du noch nicht verinnerlicht zu haben...
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Padidem
User
Beiträge: 63
Registriert: Donnerstag 8. Januar 2015, 14:52

also habe das jetzt mal so angefangen und mir die Jahre in einer Liste gemerkt:

Code: Alles auswählen

reader = csv.reader(open("armutsgefahr.txt", "rb"), delimiter="\t")

Read = [row for row in reader]

Jahr= Read[0][1:10]

Jahr
Out[103]: ['2005', '2006', '2007', '2008', '2009', '2010', '2011', '2012', '2013']
Antworten