' ASCII'编解码器无法通过pyodbc解码 - CSV到SQL Server

时间:2017-05-24 17:29:45

标签: python sql-server csv pyodbc non-ascii-characters

我搜索了很多例子,但没有一个能够解决我的具体问题。感谢您抽出时间,因为我无法为我的生活找到解决方法。我试图使用Python中的for循环将CSV文件插入Azure SQL Server数据库。我已经多次使用同一个python程序将多个不同的CSV文件,所以我知道底层问题是当前的CSV。下面是我的Python代码的简短片段,以及错误。如何对CSV进行编码,以便不再出现此错误(如上所述,我尝试过多个类似线程的解决方案,但无法解决此问题。)

代码:

   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)

如上所述,这只是我的代码片段,但是我已经使用了很多次,所以我知道语法是正确的。以下是我无法解决的错误。

错误:

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)

再次,非常感谢你们所有的帮助。

此外 - 我已尝试批量将此CSV插入本地SQL Server数据库并且一直收到错误&#34;操作系统错误代码(null)&#34;

再次感谢您的帮助或建议,因为我仍然有点新鲜,并且尽可能多地学习。

1 个答案:

答案 0 :(得分:2)

听起来这是您的CSV文件第一次包含&#39; ascii&#39;编解码器无法处理。 0x96不是latin1字符集中的字符之一,因此下一个最有可能的候选人可能是windows-1252 0x96代表&#34; En Dash&# 34;人物(U + 2013)。如果是这样的话那么

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

将产生以下输出

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