2017-05-24 2 views
1

Ich habe nach zahlreichen Beispielen gesucht, aber keiner konnte mein spezifisches Problem lösen. Danke, dass du dir die Zeit genommen hast, denn ich kann nicht um mein Leben herum einen Weg finden. Ich versuche, eine CSV-Datei mit einer for-Schleife in Python in eine Azure SQL Server-Datenbank einzufügen. Ich habe dieses gleiche Python-Programm mehrmals verwendet mehrere CSV-Dateien, so dass ich das zugrunde liegende Problem mit dieser aktuellen CSV kennen. Im Folgenden finden Sie einen kurzen Ausschnitt meines Python-Codes und den Fehler. Wie kann ich die CSV codieren, so dass dieser Fehler nicht mehr aufgetreten ist (wie erwähnt, habe ich Lösungen aus mehreren ähnlichen Threads versucht und konnte dies nicht lösen).'ascii' Codec kann nicht dekodieren - CSV zu SQL Server über pyodbc

Code:

csvfile = open('C:\\file.csv', 'r') 
    csv_data = csv.reader(csvfile) 

    SQL = """Insert into Idea_Pipeline([col_1], [col_2], [col_3], [col_4]) 
      values (?,?,?,?) 

    for row in csv_data: 
    first_row = next(csv_data) 
    cursor2.execute(SQL, row) 

Wie bereits erwähnt, ist dies nur ein Ausschnitt aus meinem Code, aber ich habe diese mehrfach verwendet, so weiß ich die Syntax korrekt ist. Unten ist der Fehler, den ich nicht lösen kann.

Fehler:

Traceback (most recent call last): 
File "Idea_Pipeline.py", line 46, in <module> 
cursor2.execute(SQL, row) 
UnicodeDecodeError: 'ascii' codec can't decode byte 0x96 in position 114: 
ordinal not in range(128) 

Nochmals vielen Dank für all die Hilfe.

Auch - Ich habe versucht, Bulk-Einfügen dieser CSV in eine lokale SQL Server-Datenbank und haben für jede Hilfe oder Rat den Fehler „Operating System Error Code (null)“

Nochmals vielen Dank wurde empfangen wie ich noch etwas bin neu und versuche so viel wie möglich zu lernen.

Antwort

2

Es klingt, als wäre dies das erste Mal, dass Ihre CSV-Datei Zeichen enthält, die der "ASCII" -Codec nicht verarbeiten kann. 0x96 gehört nicht zu den Zeichen im Zeichensatz latin1, daher ist der wahrscheinlichste Kandidat wahrscheinlich windows-1252, in dem 0x96 das Zeichen "En Dash" (U + 2013) darstellt. Wenn das der Fall ist, dann

# -*- coding: windows-1252 -*- 
import csv 
import pyodbc 
import sys 
print("Python version " + sys.version) 
print("pyodbc version " + pyodbc.version) 
cnxn = pyodbc.connect("DSN=myDb", autocommit=True) 
crsr = cnxn.cursor() 
crsr.execute("CREATE TABLE #foo (id INT PRIMARY KEY, txtcol VARCHAR(50))") 

with open(r'C:\Users\gord\Desktop\sample.csv', 'rb') as csvfile: 
    csv_data = csv.reader(csvfile) 
    sql = "Insert into #foo ([id], [txtcol]) VALUES (?,?)" 
    print("") 
    print("Rows retrieved from CSV file:") 
    for row in csv_data: 
     print(row) 
     crsr.execute(sql, [cell.decode('windows-1252') for cell in row]) 
print("") 
print("Values retrieved from table:") 
for row in crsr.execute("SELECT * FROM #foo").fetchall(): 
    print(row) 
cnxn.close() 

die folgende Ausgabe

Python version 2.7.13 (v2.7.13:a06454b1afa1, Dec 17 2016, 20:42:59) [MSC v.1500 32 bit (Intel)] 
pyodbc version 4.0.16 

Rows retrieved from CSV file: 
['1', 'foo'] 
['2', 'test\x96data'] 

Values retrieved from table: 
(1, u'foo') 
(2, u'test\u2013data') 
produzieren
Verwandte Themen