2017-12-05 10 views
0

액세스 데이터베이스에서 테이블 목록을 가져 오려고합니다. 스크립트가 완료되어 약 1/3의 표가 표시되고 다음 오류가 발생합니다.UnicodeDecodeError : 'utf-16-le'

Traceback (most recent call last): File "C:/GageInfo/sourcecode for GageTrakNotify/__test script.py", line 31, in for fld in cursor2.columns(rows.table_name): UnicodeDecodeError: 'utf-16-le' codec can't decode bytes in position 132-133: illegal encoding

팁을 주시면 감사하겠습니다.

import pyodbc 


cursor1 = conn.cursor() 
cursor2 = conn.cursor() 

tblCount = 0 
for rows in cursor1.tables(): 
    if rows.table_type == "TABLE": 
     tblCount += 1 
     print(rows.table_name) 
     for fld in cursor2.columns(rows.table_name): 
      print(fld.table_name, fld.column_name) 

conn.close() 
+0

현재 코드의 출력을 사용하여 마지막으로 성공한 인쇄물을 식별 한 다음 Access에서 데이터베이스를 열고 디자인 뷰에서 테이블을 검사하여 오류의 원인이되는 열 이름 (또는 테이블 이름)을 확인합니다. 그런 다음 질문을 편집하여 질문을하십시오. –

답변

0

테이블 이름에 어딘가에 유니 코드 (ASCII가 아닌 문자)가 삽입 된 것 같습니다. 알아내는 어떤 것이 그런 경우 또는 아니지만, 궁극적으로는 파이썬 스크립트 그냥 문자열 decode 방법으로 수행 할 수 있습니다 유니 코드 처리 할 것인지 여부를 확인합니다에 중지의 식탁이 어디 수행해야

for fld in cursor2.columns(rows.table_name.decode('utf-16-le')): 

을 유니 코드 문자가자를 가능성이 있습니다 (예 : 열 이름도 마찬가지입니다).

+0

테이블/열 이름의 유니 코드 문자는 문제가되지 않습니다 *. 방금 Python 3.6에서 pyodbc 4.0.21을 테스트했는데 문제의 코드가 Access 2010 ODBC 드라이버를 사용하여'[pile of] '열을 올바르게 인쇄합니다. (이모티콘은 BMP 외부에 있으므로 ODBC 드라이버와 pyodbc가 UTF-16 서로 게이트 쌍을 처리 할 수 ​​있음을 증명합니다.) –

+0

동의 함, @GordThompson. 'print' 문 (이제는 Python 3에서 작동합니다)이 그것을 처리 할 수 ​​있습니다. 그래서 나는 그의 코드에서'print (rows.table_name)'이 정상적으로 실행되는 이유라고 생각합니다. 내가 경험 한 것은 가져온 모듈과 관련된 객체 (그리고 그들의 수행 방법)가 유니 코드 인코딩을 처리 할 수 ​​없다는 것입니다. 그래서 아마도'cursor2.columns (rows.table_name)'이 오류를 일으키는 것 같습니다. 가장 최근에 엑셀 파일에 쓰는 모듈로이 문제가 발생했습니다. 필자가 작성한 것에'디코드 '를 먼저 적용하지 않으면 쓰기가 불가능합니다. –

+0

나는 이것을 시도했지만 객체에 '디코드'속성이 없다는 오류가 발생했습니다. –

0

감사의 말과 의견을 보내 주셔서 감사합니다. 목록의 정보를 캡처 한 다음 결과를 출력하고 try 문을 사용하여 오류를 처리하고 올바른 유니 코드를 적용하여 문제를 해결했습니다.

귀하의 제안은 올바른 방향으로 나를 가리켰습니다.