2016-11-18 5 views
0

저는 파이썬 초보자입니다. CSV 파일을 구문 분석하고 해당 내용을 데이터베이스에 추가하려고합니다.CSV to Python : 여러 인수 전달

내 현재 코드 :

with open('fruit.csv', 'rb') as f: 
reader = csv.reader(f, delimiter='\t', quoting=csv.QUOTE_NONE) 
for row in reader: 
    sql = "INSERT INTO fruit(ID,NAME,COLOUR,SIZE) VALUES(?, ?, ?, ?)" 
    try: 
     cursor.execute(sql, [ row[0], row[1], row[2], row[3] ]) 
     db.commit() 
     print('done') 
    except csv.Error as e: 
     print('error: ' + e) 
     db.rollback() 

나의 현재 오류 :

Traceback (most recent call last): 
    File "mysqltest.py", line 23, in <module> 
    cursor.execute(sql, (row[0], row[1], row[2], row[3])) 
    File "C:\Python27\lib\site-packages\MySQLdb\cursors.py", line 187, in execute 
    query = query % tuple([db.literal(item) for item in args]) 
TypeError: not all arguments converted during string formatting 

내가 SE 여기에 다른 많은 질문에 대한 답변을 읽을 수는 있지만 아직도 여러 값을 전달하는 방법을 이해할 수 없다 SQL 문자열에 대한 별도의 값으로 행 내에서.

확실하지 경우 관련 그러나 이것은 내가에 쓰기를 시도하고있어 테이블의 구조 : 누군가가 내가 잘못 무엇인지 설명 할 수 있다면

TABLE FRUIT (
     ID int primary key NOT NULL, 
      NAME CHAR(20) NOT NULL, 
      COLOUR CHAR(20), 
      SIZE CHAR(20)) 

은, 정말 이해할 수있을 것입니다!

+0

목록 목록 끝에 쉼표를 넣으십시오. 더 많은 목록 목록 대신 튜플을 사용해보십시오 :) –

+0

내가 그것을 이해하는 방법은, 남겨두고? 나중에 .execute() 호출에서 인수를 전달할 수 있지만, % s (실패한 경우)를 시도했을 때 인수로 전달하려고했습니다. 방금 .format을 추가하고 나머지 부분을 조정할 때 .format을 추가하려고 시도했지만 프로그래밍 오류가 발생하여 (?,?,?,?) 근처에서 구문을 읽도록 지시 받았습니다. – Nicholas

+0

@ Dex'ter 답장을 보내 주셔서 감사합니다. 이게 당신이 의미 한 것 같아요? vals = (행 [0], 행 [1], 행 [2], 행 [3]). ]) cursor.execute (sql, vals) ' – Nicholas

답변

1

는 MySQL은 %s 조작하지 ?을 이용한다.

sql = "INSERT INTO fruit(ID, NAME, COLOUR, SIZE) VALUES(%s, %s, %s, %s)" 
try: 
    cursor.execute(sql, [row[0], row[1], row[2], row[3]]) 
+0

고맙습니다. 다른 문항에서이 구문을 발견했지만 결과가 나타납니다 : 'Traceback (최근 호출 마지막) : 파일 "mysqltest.py", 줄 23, 커서 ".execute (sql, [row [0], 행 [1], 행 [2], 행 [3]] 실행 파일self.errorhandler 파일 "C : \ Python27 \ lib \ site-packages \ MySQLdb \ cursors.py" (self, exc, value) 파일 "C : \ Python27 \ lib \ site-packages \ mysqldb \ connections.py", 줄 36, 오류 메시지 처리기에 넣기 오류 클래스 오류 집합 _mysql_exceptions.OperationalError : (1366, "잘못된 정수 값 : 'ID'행의 'ID'에 대한 행 ")' – Nicholas

+0

이제 나는 그것을 보았습니다. 왜냐하면 첫 번째 행은 실제로 헤더이므로 diff로 분석해야하기 때문입니다. 격렬히 내가 그것을 건너 뛰어도 작동하는지 알 수 있습니다. – Nicholas

+1

첫 번째 행이 헤더 인 경우'with (...) '문 바로 뒤에'next (f)'를 추가하여 건너 뜁니다. 또한,'int()'로 형변환 해보십시오. – Parfait

0

유형 오류라고 생각합니다. 그래서 아래 코드를 시도해 볼 수 있습니다.

사용 STR() 함수 가장 파이썬 API 모듈에

cursor.execute(sql, [ str(row[0]), str(row[1]), str(row[2]), str(row[3]) ]) 
+0

기쁨이 없습니다. 나는 또한 데이터베이스의 int이기 때문에 행 [0]을 그대로 두려고 시도했다. 내 구문이 잘못되었다고 생각하지만 어떻게해야할지 모르겠다. – Nicholas