2016-10-06 203 views
2

我在將CSV文件上傳到MS SQL Server中的表格時遇到問題,CSV文件有25列,並且標題與SQL中具有25個列的表名相同。當我運行腳本時會拋出錯誤使用Python將CSV文件導入到SQL Server中

params arg (<class 'list'>) can be only a tuple or a dictionary 

將此數據導入MS SQL的最佳方式是什麼? CSV和SQL表都具有完全相同的列名稱。

下面是代碼:

import csv 
import pymssql 

conn = pymssql.connect(
    server="xx.xxx.xx.90", 
    port = 2433, 
    user='SQLAdmin', 
    password='xxxxxxxx', 
    database='NasrWeb' 
) 

cursor = conn.cursor() 
customer_data = csv.reader('cleanNVG.csv') #25 columns with same header as SQL 

for row in customer_data: 
    cursor.execute('INSERT INTO zzzOracle_Extract([Customer Name]\ 
     ,[Customer #]\ 
     ,[Account Name]\ 
     ,[Identifying Address Flag]\ 
     ,[Address1]\ 
     ,[Address2]\ 
     ,[Address3]\ 
     ,[Address4]\ 
     ,[City]\ 
     ,[County]\ 
     ,[State]\ 
     ,[Postal Code]\ 
     ,[Country]\ 
     ,[Category ]\ 
     ,[Class]\ 
     ,[Reference]\ 
     ,[Party Status]\ 
     ,[Address Status]\ 
     ,[Site Status]\ 
     ,[Ship To or Bill To]\ 
     ,[Default Warehouse]\ 
     ,[Default Order Type]\ 
     ,[Default Shipping Method]\ 
     ,[Optifacts Customer Number]\ 
     ,[Salesperson])''VALUES(%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,)',row) 

conn.commit() 
cursor.close() 
print("Done") 
conn.close() 

這是CSV文件的第一行是什麼樣子

enter image description here

+0

您可以顯示CSV文件的第一行(或第一行的第一列...),以便我們可以看到它是什麼樣的? –

+0

剛剛截圖了數據的樣子。 @SergeBallesta – Cesar

+1

您應該複製CSV的文本,而不是截取Excel的截圖,這會刪除文件的分隔符 –

回答

0

您正在使用csv.reader不正確。的第一個參數.reader不是路徑CSV文件,它是

支持迭代器協議及其每個__next__()方法被調用時返回一個字符串[一個]對象 - 文件對象和列表對象都適當。

因此,根據在documentation的例子,你應該做這樣的事情:

import csv 
with open('cleanNVG.csv', newline='') as csvfile: 
    customer_data = csv.reader(csvfile) 
    for row in customer_data: 
     cursor.execute(sql, tuple(row)) 
0

檢查表中的數據類型,以及每個字段的大小爲好。如果它是varchar(10)並且您的數據長度爲20個字符,則會引發錯誤。

此外,

考慮動態構建查詢,以確保佔位符的數量的表格和CSV文件格式相匹配。那麼這只是確保您的表格和CSV文件是正確的,而不是檢查您輸入的內容是否足夠?您的代碼佔位符。

以下示例假設

CSV file contains column names in the first line 
Connection is already built 
File name is test.csv 
Table name is MyTable 
Python 3 

... 
with open ('test.csv', 'r') as f: 
    reader = csv.reader(f) 
    columns = next(reader) 
    query = 'insert into MyTable({0}) values ({1})' 
    query = query.format(','.join(columns), ','.join('?' * len(columns))) 
    cursor = connection.cursor() 
    for data in reader: 
     cursor.execute(query, data) 
     cursor.commit() 

如果列名不包括在文件中:

... 
with open ('test.csv', 'r') as f: 
    reader = csv.reader(f) 
    data = next(reader) 
    query = 'insert into dbo.Test values ({0})' 
    query = query.format(','.join('?' * len(data))) 
    cursor = connection.cursor() 
    cursor.execute(query, data) 
    for data in reader: 
     cursor.execute(query, data) 
    cursor.commit() 

基本上,雖然,你的代碼看起來不錯。這是一個通用示例。

cur=cnxn.cursor() # Get the cursor 
csv_data = csv.reader(file(Samplefile.csv')) # Read the csv 
for rows in csv_data: # Iterate through csv 
    cur.execute("INSERT INTO MyTable(Col1,Col2,Col3,Col4) VALUES (?,?,?,?)",rows) 
cnxn.commit() 
相關問題