2013-06-30 1 views
2

내 문제는 간단히 말해서 내 스크립트가 완전한 유니 코드 문자열 (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" 
+1

왜 r.next()를 두 번하고 있습니까? 두 번째 케이스의 첫 번째 케이스와 두 번째 케이스의 두 번째 줄을 인쇄하지 않습니까? –

+0

그 이유는 첫 번째 행이 필드 이름이기 때문입니다. 나중에 추가했습니다. 방금 문제를 강조하기 위해 r.next()를 두 번했습니다. –

+0

csvsql을 사용하여 mssql에 CSV 데이터를로드하는 동안 비슷한 문제가 발생합니다. 모든 텍스트 필드는 단일 문자로로드됩니다. 어떤 아이디어일까요? 파일의 인코딩은 무엇이되어야합니까? (드라이버가 우분투에서 freetds입니다) –

답변

1
import StringIO as sio 
import unicodecsv as ucsv 

class Report(object): 
    def __init__(self, data): 
     self.data = data 

report = Report( 
    [ 
    ["University of Washington Students", 1, 2, 3], 
    ["UCLA", 5, 6, 7] 
    ] 
) 



print report.data 
print report.data[0][0] 

print "*" * 20 

f = sio.StringIO() 
writer = ucsv.writer(f, encoding='utf-8') 
writer.writerows(report.data) 

print f.getvalue() 
print "-" * 20 

f.seek(0) 

reader = ucsv.reader(f) 
row = reader.next() 

print row 
print row[0] 



--output:-- 
[['University of Washington Students', 1, 2, 3], ['UCLA', 5, 6, 7]] 
University of Washington Students 
******************** 
University of Washington Students,1,2,3 
UCLA,5,6,7 

-------------------- 
[u'University of Washington Students', u'1', u'2', u'3'] 
University of Washington Students 

에서 가져온 문자열 형식을 확인하는 것입니다.

+0

위와 같이 코드에서 직접 목록을 만드는 경우 문제가 없습니다. 문제는 DB에서 가져 오는 유니 코드 데이터 때문입니다. whatisthis 기능을 설명하는 편집을 참조하십시오. –

+0

왜 코드에 whatis() 함수를 포함 시켰습니까? 그것은 어떻게 관련이 있는가? 인쇄물 유형 (report.data)에 대한 출력물은 무엇입니까? – 7stud

+0

report.data는 목록입니다 –