Anfängerproblem: SQLite-Abfrage => Fehlermeldung "TypeError"

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
DaWalda
User
Beiträge: 3
Registriert: Dienstag 3. Juli 2012, 09:29

Hallo, Python-pros,

Das ist mein erster Post. Vermutlich ist die Frage dumm und das Problem auch schon irgendwo gelöst, aber ich komme von selbst nicht drauf und auch intensiveres googlen und lesen hat mir nicht geholfen.

Folgendes: Ich habe eine SQLite-Datenbank namens "Literaturkorpus" mit u.a. einer Tabelle namens "Werke" mit u.a. einer text-column namens "Pfad". In dieser column habe ich relative Pfadangaben zu txt-Files gespeichert.
Ich möchte jetzt in Python diese Datenbank abfragen und die Text-Files, auf die in der Pfad-Spalte verwiesen wird, in einen neuen Ordner im Working Directory kopieren. Wenn ich das aber versuche, dann bekomme ich immer die Fehlermeldung "IOError: 'in <string>' requires string as left operand, not tuple."

Wenn mir da jemand helfen könnte, wäre ich sehr dankbar. Hier mein (vereinfachter) Code:

Code: Alles auswählen

import os
import shutil
import sqlite3
Working_Directory=os.getcwd()
connection=sqlite3.connect(os.path.join(Working_Directory, 'Literaturkorpus.sqlite'))
cursor=connection.cursor()
primary_set = os.path.join(Working_Directory, 'primary_set')
os.makedirs(primary_set)
cursor.execute("SELECT Pfad FROM Werke WHERE NotBefore<1700")
for row in cursor:
    shutil.copyfile(row, os.path.join(primary_set, row))


Ich glaube, der Knackpunkt ist das zweite "row" in der letzten Zeile. Aber ich komme nicht darauf, wie ich eine relative Pfadangabe aus der SQLite-Datenbank im os.path.join verfügbar mache.
Weiß zufällig jemand, was ich falsch mache?

Danke im Voraus,
liebe Grüße
DaWalda
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Ich habe es jetzt nicht noch mal in der Dokumentation überprüft, aber es sieht so aus, als liefere dir row alle abgefragten Spalten in einem Tupel. Du hast dir jetzt nur eine Spalte zurückgeben lassen. Die steht dann an der ersten Position und da bei 0 angefangen wird zu zählen folglich in row[0]. Überprüfen kannst du das durch ein einfaches print row als erste Zeile in der for-Schleife.

Wenn das jetzt wirklich das Problem sein sollte, dann brauchst du folglich nur row[0] statt row innerhalb der Schleife verwenden.
DaWalda
User
Beiträge: 3
Registriert: Dienstag 3. Juli 2012, 09:29

Hallo /me,

Danke für die Antwort. Ich bin mir nicht hundertprozentig sicher, ob ich dich richtig verstanden habe, aber wenn ich dich richtig verstanden habe, hast du mir geraten, zum Schluss zu versuchen:

Code: Alles auswählen

cursor.execute("SELECT Pfad FROM Werke WHERE NotBefore<1700")
for row in cursor:
    print(row)
Da werden mir aber die gewünschten Ergebnisse angezeigt.
Habe ich dich richtig verstanden?

Liebe Grüße
DaWalda
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

DaWalda hat geschrieben:Da werden mir aber die gewünschten Ergebnisse angezeigt.
Ja, aber was genau wird angezeigt? Ich vermute, dass du nicht einen String als Rückgabe bekommst, sondern einen String in einem Tupel.

Code: Alles auswählen

>>> value = 'foo'
>>> print value
foo
>>> value = 'foo',
>>> print value
('foo',)
>>> print value[0]
foo
>>> print type(value)
<type 'tuple'>
>>> print type(value[0])
<type 'str'>
DaWalda
User
Beiträge: 3
Registriert: Dienstag 3. Juli 2012, 09:29

Ah, ich Genie...

Du hast völlig recht, das war der Fehler.
Riesiges Danke :)
Antworten