我搜索了很多例子,但没有一个能够解决我的具体问题。感谢您抽出时间,因为我无法为我的生活找到解决方法。我试图使用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;
再次感谢您的帮助或建议,因为我仍然有点新鲜,并且尽可能多地学习。
答案 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')