TypeError: not all arguments converted during string formatting

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
locust
User
Beiträge: 4
Registriert: Donnerstag 23. Juni 2016, 08:25

Hallo,

ich versuche vergebens einen Teil einer CSV Datei nach MySQL zu importieren.
Die ersten 10000 Zeilen importieren sauber, doch beim zweiten Teil mache ich irgendwo einen
Fehler.

Code: Alles auswählen

with open('exportall.csv', 'rb') as csvfile2:
		reader2 = csv.reader(csvfile2, delimiter=';', quotechar='"')
		i=0
		for row1 in reader2:
			i=i+1
			if i>=start1 and i<=end:
				print(i)
									
			elif i>=start2:
				print(row1)
				try:
						
					cursor.execute("INSERT INTO tradeposition (trade,posnumber,ptype,numer,title,unit,buperou,quantity,price,discount,surcharge,vattype,costtype,shippingweight) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s);", row1)
					
				except MySQLdb.Error, e:
					print "Error %d: %s" % (e.args[0], e.args[1])
					sys.exit(1)

	db.commit()			
	db.close()	
Die erste for-schleife ist zur Teilung der CSV-Datei (start1,end,start2 sind Zeilennummern)

Die Zeile die nicht importiert samt Error lautet:

['IN1015', '0.01', '0', '0914', 'Abh\xc3\xa4ngehaken, einfach', 'L\xc3\xa4nge 15cm, f\xc3\xbcr Locatelli-W\xc3\xa4nde Quadratlochung 11x11mm, RAL 9006', ' ', '1', '300', '3.0000', '0', '0.00', '0', '', '']


Traceback (most recent call last):
File "DPS-NEW.py", line 268, in <module>
importTradePosition()
File "DPS-NEW.py", line 228, in importTradePosition
cursor.execute("INSERT INTO tradeposition (trade,posnumber,ptype,numer,title,unit,buperou,quantity,price,discount,surcharge,vattype,costtype,shippingweight) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s);", row1)
File "build/bdist.macosx-10.5-x86_64/egg/MySQLdb/cursors.py", line 187, in execute
TypeError: not all arguments converted during string formatting


Hoffe jemand hat eine Idee.
Danke im Voraus
Sirius3
User
Beiträge: 17747
Registriert: Sonntag 21. Oktober 2012, 17:20

@locust: wenn Du versuchst 15 Felder in eine Tabelle mit 14 Feldern zu schreiben, kann das nicht funktionieren.

Wenn man nur Teile einer Sequenz verwenden möchte gibt es dafür itertools.islice:

Code: Alles auswählen

try:
    with open('exportall.csv', 'rb') as csvfile2:
        reader2 = csv.reader(csvfile2, delimiter=';', quotechar='"')
        for row in islice(reader2, start2, None):
            cursor.execute("INSERT INTO tradeposition (trade,posnumber,ptype,numer,title,unit,buperou,quantity,price,discount,surcharge,vattype,costtype,shippingweight) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s);", row)
    db.commit()        
    db.close() 
except MySQLdb.Error, e:
    print "Error %d: %s" % (e.args[0], e.args[1])
BlackJack

@locust: Kleine Anmerkung zu den Namen: Wenn Du anfängst Nummern an Namen zu hängen, dann machst Du in 99% der Fälle etwas falsch. Entweder willst Du die Nummern einfach weglassen, oder bessere Namen verwenden, oder statt einzelner Namen eine Datenstruktur verwenden (meistens eine Liste), oder das ist ein Zeichen das zu viel Code in einer Funktion steckt.
locust
User
Beiträge: 4
Registriert: Donnerstag 23. Juni 2016, 08:25

Ich blinde Nuss, habe dreimal meine %s mit den Datenbankfeldern verglichen, aber nicht mit der CSV Datei.
Danke für den Tip mit itertools !!

Beste Grüße

Locust
Antworten