2017-05-24 94 views
1

我已经搜索了很多例子,但没有一个能够解决我的具体问题。感谢您抽出时间,因为我无法为我的生活寻找解决办法。我试图在Python中使用for循环将CSV文件插入到Azure SQL Server数据库中。我已经使用这个相同的Python程序无数次将多个不同的CSV文件,所以我知道底层的问题是这个当前的CSV。以下是我的Python代码的简短片段,以及错误。我怎样才能编码的CSV,所以这个错误不再发生(如上所述,我尝试了来自多个类似的线程的解决方案,并没有能够解决这个问题)。'ascii'编解码器无法解码 - 通过pyodbc CSV到SQL Server

代码:

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数据库,并已收到错误“操作系统错误代码(空)”的任何帮助或建议,因为我还是有点新的和我试图尽可能多地学习可以。

回答

2

听起来这是您的CSV文件第一次包含'ascii'编解码器无法处理的字符。 0x96不是latin1字符集中的字符之一,因此下一个最有可能的候选字符可能是windows-1252,其中0x96表示“En Dash”字符(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') 
相关问题