Datenimport in PostgreSQL datenbank mit Hilfe von Phyton

Code-Stücke können hier veröffentlicht werden.
BoOnOdY
User
Beiträge: 112
Registriert: Samstag 22. Juli 2006, 13:38

Datenimport in PostgreSQL datenbank mit Hilfe von Phyton

Beitragvon BoOnOdY » Sonntag 30. Juli 2006, 17:53

Hy, hab keinen Bereich gefunden in den das wirklich rien passt, hoffe ich hab das hier net zu weit ab vom Schuss gepostet.

Naja auf jedenfall.
Ich bin gerade dabei mit Python anzufangen und möchte ein paar daten daten über ein Python programm in eine PostrgeSQL datenbank mit einer festen prozedur importieren.
die Datensätze sind ne Mänge in einer .txt vertaut und haben alle das gleiche Format und sind immer mit einem Enter voneinander getrennt

09.05.2006;16:57:56:322;5;1;442075194600;496663918522;111039;CAU_NCC
09.05.2006;17:00:54:969;5;1;;552227342758;;CAU_NCC


und die müssten immer in ne datenbank eingespielt werden.


Kann mir vieleicht jemand ein Tutorial link geben oder so? weil ich hab noch nix großartiges gefunden und vieleicht kann mir ja auch jemand den quelltext schreiben und erklären.

Ich denk ma man muss zu der database verbinden und dann irgendwie das ganze in ne Schleife einbauen, aber wie is die syntax dazu in Phyton?

Danke schon ma für jedes Lesen und noch mehr für jede Antwort

Tim
Benutzeravatar
DatenMetzgerX
User
Beiträge: 398
Registriert: Freitag 28. April 2006, 06:28
Wohnort: Zürich Seebach (CH)

Beitragvon DatenMetzgerX » Sonntag 30. Juli 2006, 18:41

Code: Alles auswählen

f = open('mytextfile.txt', 'r')
text = f.readlines()
for line in text:
    date, time, i1, i2, l1, l2, i3, s1 = line.split(';')


Nachher kannst du das irgend wie in deine Datenbank speichern ;)
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5554
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Telfs (Tirol)
Kontaktdaten:

Re: Datenimport in PostgreSQL datenbank mit Hilfe von Phyton

Beitragvon gerold » Sonntag 30. Juli 2006, 18:56

BoOnOdY hat geschrieben:in eine PostrgeSQL datenbank

Hi Tim!

Dieser Link hilft dir zumindest schon mal beim Installieren von "Psycopg2", was auf jeden Fall eine Empfehlung als Schnittstelle für den Zugriff auf PostgreSQL ist:
http://www.python-forum.de/topic-6618.html

Hier noch ein kleines Tutorial:
http://www.initd.org/tracker/psycopg/wi ... rogramming

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5554
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Telfs (Tirol)
Kontaktdaten:

Beitragvon gerold » Sonntag 30. Juli 2006, 18:59

Hi Tim!

Zum Auslesen und Schreiben von CSV-Dateien gibt es in Python ein eigenes Modul.

Siehe diese Links:
- http://www.python-forum.de/post-38057.html#38057
- http://docs.python.org/lib/module-csv.html
- http://docs.python.org/lib/node636.html
- http://www.python-forum.de/topic-6169.html

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs

Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
BoOnOdY
User
Beiträge: 112
Registriert: Samstag 22. Juli 2006, 13:38

Beitragvon BoOnOdY » Sonntag 30. Juli 2006, 20:12

hey danke, mit psycopg2 hab ich im Ramen von Zope schon experimentiert, kann man das etwa auch außerhalb von zope nutzen?

oder noch besser, wie würde denn der quelltext aussehen, wenn ich das mit zope ,machen will?

also so ne seite mit nem button, und vieleicht später noch so nem Durchsuchen feld, wo ich dann den Pfad angeben kann, das wär bestimmt ma ne coole Sache

gruß tim
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5554
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Telfs (Tirol)
Kontaktdaten:

Beitragvon gerold » Sonntag 30. Juli 2006, 22:28

BoOnOdY hat geschrieben:hey danke, mit psycopg2 hab ich im Ramen von Zope schon experimentiert, kann man das etwa auch außerhalb von zope nutzen? oder noch besser, wie würde denn der quelltext aussehen, wenn ich das mit zope ,machen will?

Hi Tim!

Den "Quelltext" musst du dir schon selber schreiben. ;-)

Ja, psycopg2 ist die eigentliche Python-PostgreSQL-Schnittstelle. Zope greift einfach darauf zu. Allerdings muss man psycopg2 für das normale Python (das nicht in Zope integriert ist) extra installieren.

Für Windows: Einfach die Datei http://www.stickpeople.com/projects/pyt ... -py2.4.exe herunterladen und ausführen. Natürlich sollte vorher Python 2.4.x installiert sein.

Danach kannst du von Python aus auf PostgreSQL-Datenbanken zugreifen.
Wie das geht, verrät dir das Tutorial auf das ich dich bereits hingewiesen habe. http://www.initd.org/tracker/psycopg/wi ... rogramming

Für Allgemeines zum Thema SQL: Suche einfach mal hier im Forum nach "SQL". Viele Anleitungen zu MySQL gelten ohne große Änderung meist auch für PostgreSQL.

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs

Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5554
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Telfs (Tirol)
Kontaktdaten:

Beitragvon gerold » Sonntag 30. Juli 2006, 22:37

gerold hat geschrieben:Für Allgemeines zum Thema SQL: Suche einfach mal hier im Forum nach "SQL".

Hi!

SQL wird dir hier recht gut erklärt:
http://www.postgresql.org/files/documen ... l-sql.html
http://www.postgresql.org/docs/books/pghandbuch.html.de

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs

Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
BoOnOdY
User
Beiträge: 112
Registriert: Samstag 22. Juli 2006, 13:38

Beitragvon BoOnOdY » Montag 31. Juli 2006, 06:49

ja danke:)
dann werd ich mich da ma durchboxen ;)
ein sql Buch hab ich mir schon selbst besorgt, hab halt nur das Problem, das das immer nur einzelne Daten einlesen mag mit der Import funktion und net nen ganzen Rutsch aus ner csv, aber mit hilfe der Tutorials usw. versuch ich ma so was anzufangen.

Noch ne letzte Frage, wenn ich dann mit phyton ne database connection hab, kann ich dann einfach die normalen SQL befehle nutzen?
BoOnOdY
User
Beiträge: 112
Registriert: Samstag 22. Juli 2006, 13:38

Beitragvon BoOnOdY » Montag 31. Juli 2006, 19:18

Hey, kann ich bitte mal ein konkretes Beispiel dafür haben wenn ich dem sagen will, dass er die datei einlesen soll, und in eine SQL datenbank schreiben... so spontan würd ich sagen ,üsste das so aussehen:


Code: Alles auswählen

import psycopg
import csv
reader = csv.reader(open("some.csv", "r"))
conn= connect ('dbname=test user=tim pw=1234')
curs= conn.cursor()



soo und wie bestimme ich jetzt, dass er ausließt, bis zu einem semikolon und dann das ganze in eine sql datenbank packt?
müsste ja dann weitergehen (wenn schon mit popy eine verbindung zu der sql datenbank hergestellt ist)

Code: Alles auswählen

Curse.ececute(
       "Insert into test
       (datum, zahl, zahl, bezeichnung)
        values
       ( ?, ?, ?, ?)"
)


muss ich die ausgelesenen sachen in variablen packen oder kann ich die irgendwie einfach so in values übergeben?
wiederholt sich die prozedur von alleine bis die ganze CSV ausgelesen ist?
ist das CSV modul von vorneherein in python bei der installation dabei?
muss ich popy im python scirpt noch erwähnen oder reicht es, wenn es bei zope mit der database verbunden ist?


Freu mich schon auf die Antworten :)

Tim
BlackJack

Beitragvon BlackJack » Montag 31. Juli 2006, 21:07

BoOnOdY hat geschrieben:Hey, kann ich bitte mal ein konkretes Beispiel dafür haben wenn ich dem sagen will, dass er die datei einlesen soll, und in eine SQL datenbank schreiben... so spontan würd ich sagen ,üsste das so aussehen:


Code: Alles auswählen

import psycopg
import csv
reader = csv.reader(open("some.csv", "r"))
conn= connect ('dbname=test user=tim pw=1234')
curs= conn.cursor()


Das Argument bei `connect()` ist falsch und `connect` ist eine Funktion im `psycopg` Modul. Die Argumente müssen nicht als eine Zeichenkette angegeben werden, sondern als keyword-Argumente.

soo und wie bestimme ich jetzt, dass er ausließt, bis zu einem semikolon und dann das ganze in eine sql datenbank packt?
müsste ja dann weitergehen (wenn schon mit popy eine verbindung zu der sql datenbank hergestellt ist)

Code: Alles auswählen

Curse.ececute(
       "Insert into test
       (datum, zahl, zahl, bezeichnung)
        values
       ( ?, ?, ?, ?)"
)


Da fehlt noch das zweite Argument, also die Werte die für die Fragezeichen in die Datenbank geschrieben werden sollen.

muss ich die ausgelesenen sachen in variablen packen oder kann ich die irgendwie einfach so in values übergeben?
wiederholt sich die prozedur von alleine bis die ganze CSV ausgelesen ist?


Das geht mit `executemany()`. Die Methode erwartet als zweites Argument ein iterable mit mehreren Datensätzen. Und das ist so ein `csv.reader()` Rückgabewert.

ist das CSV modul von vorneherein in python bei der installation dabei?


Jup.

Kleines Beispiel:

CSV Datei:

Code: Alles auswählen

Methusalem;1000
Eric;23
Future Baby;-10


Datenbank anlegen (zum Testen habe ich mal 'ne Sqlite DB genommen):

Code: Alles auswählen

$ sqlite3 test.db
SQLite version 3.2.8
Enter ".help" for instructions
sqlite> create table persons (name char(50), age int);


Das Python-Programm:

Code: Alles auswählen

import csv
from pysqlite2 import dbapi2 as sqlite

in_file = open('test.csv', 'rb')
reader = csv.reader(in_file, delimiter=';')

connection = sqlite.connect('test.db')
cursor = connection.cursor()
cursor.executemany('INSERT INTO persons (name, age) VALUES (?, ?)', reader)
cursor.close()
connection.commit()
connection.close()

in_file.close()


Und das Ergebnis:

Code: Alles auswählen

sqlite> select * from persons;
Methusalem|1000
Eric|23
Future Baby|-10
BoOnOdY
User
Beiträge: 112
Registriert: Samstag 22. Juli 2006, 13:38

Beitragvon BoOnOdY » Dienstag 1. August 2006, 10:10

So und die Fragezeichen kann ich einfach da einsetzen? sind das die Platzhalter oder wie?
ich hatte die Fragezeichen eigentlich gesetzt um zu zeigen, das ich keine Ahung hab welcher Platzhalter für die Werte da rein muss?

Weil die SQL-Syntax heist ja :
bei Insert into werden die Spalten der Datenbank eingegeben in folgender Reihenfolge

Spaltekundennummer, Spalte name

und zu dem Values Befehl ja dann die eingelesenen Daten, doch wie werden die übergeben?

Weil wenn ich einen manuellen values wert erstelle, muss ich ja eingeben

Values ( 453, 'Meier');


Wie übergibt python die Werte 453 und Meier aus der CSV ?
BlackJack

Beitragvon BlackJack » Mittwoch 2. August 2006, 08:00

BoOnOdY hat geschrieben:So und die Fragezeichen kann ich einfach da einsetzen? sind das die Platzhalter oder wie?


Ja das sind Platzhalter.

Wie übergibt python die Werte 453 und Meier aus der CSV ?


Die `executemany()` Methode bekommt als zweites Argument den `reader`, der die ganzen Zeilen enthält, pro Zeile eine Liste mit den Werten. Und genau aus diesen Listen werden die Werte auf die Platzhalter in der SQL-Anweisung verteilt.
BoOnOdY
User
Beiträge: 112
Registriert: Samstag 22. Juli 2006, 13:38

Beitragvon BoOnOdY » Mittwoch 2. August 2006, 16:27

Code: Alles auswählen

import csv
import psycopg2

in_file = open('02.08.2006.csv', 'rb')
reader = csv.reader(in_file, delimiter=';')

conn= connect ('dbname=GBC user=tim pw=1234)
curs= conn.cursor()
cursor = connection.cursor()
cursor.executemany('INSERT INTO test (Datum, Uhrzeit, Eingangsport, Ausgangsport, Eingangsnummer, Ausgangsnummer, Dauer, Hinweis) VALUES (?, ?, ?, ?, ?, ?, ?, ?)', reader)
cursor.close()
connection.commit()
connection.close()

in_file.close()


Hey, warum funzt das net? was hab ich noch nicht kapiert?

danke schon ma im Voraus und im Rückblick
Tim

PS: Wo muss die .csv liegen?
BlackJack

Beitragvon BlackJack » Mittwoch 2. August 2006, 17:07

Du bekommst von Python eigentlich meistens ganz gute Hinweise durch die Ausgabe der Exception. Bitte gib die immer mit an, am besten einfach 1:1 ins Forum kopieren.

In diesem Fall dürfte es ein Syntax-Fehler sein, weil Du, wie man auch hier am Syntax-Highlighting erkennen kann, eine Zeichenkette nicht beendest.

Dann gibt's in dem Modul den Namen `connect` nicht, das gibt einen `NameError`. Der Name steckt im `psycopg2` Modul. Das heisst Du musst die Funktion über das Modul referenzieren `psycopg2.connect()` oder den Namen mit ``from psycopg2 import connect`` in das aktuelle Modul importieren.

Und Die Übergabe der Argumente bei `connect` ist falsch. Das habe ich aber schon einmal geschrieben. Da musst Du nicht eine Zeichenkette angeben, sondern die einzelnen Optionen als Keyword-Argumente. Beispielsweise so:

Code: Alles auswählen

connection = connect(dbname='GBC', user='tim', pw='1234')


Dateien werden relativ zum Arbeitsverzeichnis des Prozesses angesprochen.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5554
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Telfs (Tirol)
Kontaktdaten:

Beitragvon gerold » Mittwoch 2. August 2006, 17:55

BlackJack hat geschrieben:

Code: Alles auswählen

connection = connect(dbname='GBC', user='tim', pw='1234')

Hi BlackJack!

*psycopg2* ist da eine Ausnahme. Das kann sowohl mit benannten Parametern oder mit einem Connection-String, wie ihn Tim verwendet, eine Verbindung aufbauen. Allerdings sollte er dabei auf die Anführungszeichen achten. ;-)

Code: Alles auswählen

>>> help(psycopg2.connect)
Help on built-in function connect in module psycopg2._psycopg:

connect(...)
    connect(dsn, ...) -- Create a new database connection.
   
    This function supports two different but equivalent sets of arguments.
    A single data source name or ``dsn`` string can be used to specify the
    connection parameters, as follows::
   
        psycopg2.connect("dbname=xxx user=xxx ...")
   
    If ``dsn`` is not provided it is possible to pass the parameters as
    keyword arguments; e.g.::
   
        psycopg2.connect(database='xxx', user='xxx', ...)
   
    The full list of available parameters is:
   
    - ``dbname`` -- database name (only in 'dsn')
    - ``database`` -- database name (only as keyword argument)
    - ``host`` -- host address (defaults to UNIX socket if not provided)
    - ``port`` -- port number (defaults to 5432 if not provided)
    - ``user`` -- user name used to authenticate
    - ``password`` -- password used to authenticate
    - ``sslmode`` -- SSL mode (see PostgreSQL documentation)
   
    If the ``connection_factory`` keyword argument is not provided this
    function always return an instance of the `connection` class.
    Else the given sub-class of `extensions.connection` will be used to
    instantiate the connection object.
   
    :return: New database connection
    :rtype: `extensions.connection`


lg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs

Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder