내 문제는 간단히 말해서 내 스크립트가 완전한 유니 코드 문자열 (db에서 검색 됨)을 CSV로 쓸 수 없으며 각 문자열의 첫 문자에 이 기록됩니다. 파일. 예를 들면 :유니 코드 문자열의 첫 문자 만 csv에 쓰여짐
University of Washington Students,1423.0,831,1,139
일부 배경 :
U,1423.0,831,1,139
출력은해야 어디에서 pyodbc를 사용하여 MSSQL 데이터베이스에 연결하고 있습니다. 내 ODBC를 구성 파일이 유니 코드에 설정 한, 다음과 같이 DB에 연결 :
p.connect("DSN=myserver;UID=username;PWD=password;DATABASE=mydb;CHARSET=utf-8")
내가 데이터를 문제를 얻을 수 있지만, 나는 csv 파일에 쿼리 결과를 저장하려고하면 문제가 발생합니다. 나는 공식 문서에서 UnicodeWriter 솔루션 인 csv.writer를 사용해 보았으며 가장 최근에 github에서 찾은 unicodecsv 모듈을 사용하려고 시도했습니다. 각 방법은 동일한 결과를 산출합니다.
이상한 일은 파이썬 콘솔에서 문자열을 인쇄 할 수 있다는 것입니다. 그러나 동일한 문자열을 가져 와서 CSV에 기록하면 문제가 발생합니다. 문제를 강조
코드 : 테스트에서
print "'Raw' string from database:"
print "\tencoding:\t" + whatisthis(report.data[1][0])
print "\tprint string:\t" + report.data[1][0]
print "\tstring len:\t" + str(len(report.data[1][0]))
f = StringIO()
w = unicodecsv.writer(f, encoding='utf-8')
w.writerows(report.data)
f.seek(0)
r = unicodecsv.reader(f)
row = r.next()
row = r.next()
print "Write/Read from csv file:"
print "\tencoding:\t" + whatisthis(row[0])
print "\tprint string:\t" + row[0]
print "\tstring len:\t" + str(len(row[0]))
출력 :
'Raw' string from database:
encoding: unicode string
print string: University of Washington Students
string len: 66
Write/Read from csv file:
encoding: unicode string
print string: U
string len: 1
은 무엇이 문제에 대한 이유가 될 수 있고 어떻게 그것을 해결할 수 있습니다 내 테스트 코드 아래 & 결과보기? 감사!
편집은 다음 whatisthis 기능은 당신의 whatisthis를() 함수에 달려 장난 알고 this post
def whatisthis(s):
if isinstance(s, str):
print "ordinary string"
elif isinstance(s, unicode):
print "unicode string"
else:
print "not a string"
왜 r.next()를 두 번하고 있습니까? 두 번째 케이스의 첫 번째 케이스와 두 번째 케이스의 두 번째 줄을 인쇄하지 않습니까? –
그 이유는 첫 번째 행이 필드 이름이기 때문입니다. 나중에 추가했습니다. 방금 문제를 강조하기 위해 r.next()를 두 번했습니다. –
csvsql을 사용하여 mssql에 CSV 데이터를로드하는 동안 비슷한 문제가 발생합니다. 모든 텍스트 필드는 단일 문자로로드됩니다. 어떤 아이디어일까요? 파일의 인코딩은 무엇이되어야합니까? (드라이버가 우분투에서 freetds입니다) –