2017-05-24 2 views
1

J'ai cherché de nombreux exemples mais aucun n'a été capable de résoudre mon problème spécifique. Merci de prendre le temps car je ne peux pas pour la vie de moi trouver un moyen de contourner cela. Je tente d'insérer un fichier CSV dans une base de données Azure SQL Server en utilisant une boucle for en Python. J'ai utilisé ce même programme python de nombreuses fois plusieurs fichiers CSV différents, donc je sais que le problème sous-jacent est avec ce CSV actuel. Voici un bref extrait de mon code Python, avec l'erreur. Comment puis-je encoder le CSV afin que cette erreur ne se produise plus (comme mentionné, j'ai essayé des solutions à partir de plusieurs threads similaires et je n'ai pas pu résoudre ce problème).Le codec 'ascii' ne peut pas décoder - CSV vers SQL Server via 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) 

Comme mentionné, ceci est juste un extrait de mon code, mais je l'ai utilisé plusieurs fois ce donc je sais que la syntaxe est correcte. Voici l'erreur que je ne peux pas résoudre.

Erreur:

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) 

Encore une fois, merci beaucoup pour toute l'aide.

aussi - j'ai essayé en vrac Insertion ce CSV dans une base de données SQL Server locale et ont reçu l'erreur « du système d'exploitation Code d'erreur (null) »

Merci encore pour toute aide ou des conseils que je suis encore un peu nouveau et j'essaie d'apprendre autant que possible.

Répondre

2

Il semble que c'est la première fois que votre fichier CSV contient des caractères que le codec 'ascii' ne peut pas traiter. 0x96 n'est pas l'un des caractères du jeu de caractères latin1, donc le prochain candidat le plus probable est probablement windows-1252 dans lequel 0x96 représente le caractère "En Dash" (U + 2013). Si tel est le cas, alors

# -*- 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() 

va produire la sortie suivante

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')