2014-03-03 1 views
0

텍스트 파일의 단어를 읽고 sqlite 데이터베이스에 입력하고 문자열로 처리하는 프로그램을 작성했습니다. 그러나 나는 게르만 umlates : äöüß을 포함하는 몇 마디를 입력해야합니다. - -python : 유니 코드로 독일어 움라우트가 포함 된 파일을 열고 읽습니다.

I의 #와 TREID 모두 코딩 : 여기서

코드 준비된 조각 ISO-8859-15 -
- 및 # - - 코딩 : UTF-8 - - 차이 (!)

# -*- coding: iso-8859-15 -*- 
    import sqlite3 

    dbname = 'sampledb.db' 
    filename ='text.txt' 


    con = sqlite3.connect(dbname) 
    cur = con.cursor() 
    cur.execute('''create table IF NOT EXISTS table1 (id INTEGER PRIMARY KEY,name)''')  

    #f=open(filename) 
    #text = f.readlines() 
    #f.close() 

    text = u'süß' 

    print (text) 
    cur.execute("insert into table1 (id,name) VALUES (NULL,?)",(text,))  

    con.commit() 

    sentence = "The name is: %s" %(text,) 

    print (sentence) 
    f.close() 
    con.close() 

위의 코드가 잘 실행됩니다. 하지만 'süß'라는 단어가 들어있는 파일에서 'text'를 읽어야합니다. 내가 3 선 (f.open (파일 이름) ....), 및 주석 텍스트 = u'süß '의 주석을 해제 할 때 그래서 내가 UTF-를 읽을 코덱을 모듈을 시도

sqlite3.InterfaceError: Error binding parameter 0 - probably unsupported type. 

오류를 제공합니다 8, iso-8859-15. 하지만 코드의 끝에 문장을 완성하는 데 필요한 'süß'문자열로 디코딩 할 수는 없습니다.

일단 데이터베이스에 삽입하기 전에 utf-8로 디코딩 해 보았습니다. 그것은 효과가 있었지만 문자열로 사용할 수는 없었습니다.

파일에서 süß를 가져올 수 있고 sqlite에 삽입하고 문자열로 사용하는 데 사용할 수 있습니까?


더 자세히 : 여기

내가 설명에 대한 자세한 내용을 추가 할 수 있습니다. 전에 codecs.open을 사용했습니다. 단어이 들어있는 텍스트 파일은 utf-8으로 저장됩니다. f=codecs.open(filename, 'r', 'utf-8')text=f.read()을 사용하여 유니 코드 u'\ufeffs\xfc\xdf'으로 파일을 읽었습니다. 이 유니 코드를 sqlite3에 삽입하면 원활하게 수행됩니다 : cur.execute("insert into table1 (id,name) VALUES (NULL,?)",(text,)). sentence = "The name is: %s" %(text,)u'The name is: \ufeffs\xfc\xdf'를 제공하고, print(text)이 오류 UnicodeEncodeError: 'charmap' codec can't encode character u'\ufeff' in position 0: character maps to <undefined>을 제공하면서 또한, 내 출력 Süßprint(text)해야합니다

문제는 여기에있다.

감사합니다.

+1

코딩 파라미터 *이 있어야합니다

간단한 해결책은 내 마음에 오는 물음표를 제거하는 것은 기능을 대체 사용하는 것입니다 'text' 리터럴에서 큰 차이를 만들었습니다. –

+1

: 모듈 상단의 코딩 선언은 소스 코드에 지정된'text = u'süß '에 영향을 미칩니다. 파일에서 읽은 텍스트에 영향을주지 않습니다. 후자의 경우'codecs.open() '을 사용할 수 있습니다. – jfs

+0

'readlines'는리스트를 반환합니다. 파일의 텍스트를 문자열로 가져 오려면'f.read(). strip()'을 사용하십시오. _ 이제 인코딩에 대해 걱정할 수 있습니다. – alexis

답변

2

문제를 해결할 수있었습니다. 도움을 주셔서 감사합니다. 여기

그것이 '

The German word is: ?süß 

여전히 작은 문제는이 :

# -*- coding: iso-8859-1 -*- 

import sys 
import codecs 
import sqlite3 

f = codecs.open("suess_sweet.txt", "r", "utf-8") # suess_sweet.txt file contains two 
text_in_unicode = f.read()       # comma-separated words: süß, sweet 
f.close() 

stdout_encoding = sys.stdout.encoding or sys.getfilesystemencoding() 

con = sqlite3.connect('dict1.db') 
cur = con.cursor() 
cur.execute('''create table IF NOT EXISTS table1 (id INTEGER PRIMARY KEY,German,English)''')  

[ger,eng] = text_in_unicode.split(',') 

cur.execute('''insert into table1 (id,German,English) VALUES (NULL,?,?)''',(ger,eng))  

con.commit() 

sentence = "The German word is: %s" %(ger,) 

print sentence.encode(stdout_encoding) 

con.close() 

내가 this page의 도움

(는 독일어의)를 얻었고, 출력은? '. 인코딩 후 유니 코드 u'?으로 바뀌 었습니다. sentence을 제공합니다

>>> sentence 
u'The German word is: \ufeffs\xfc\xdf ' 

및 인코딩 된 문장이 제공 :

>>> sentence.encode(stdout_encoding) 
'The German word is: ?s\xfc\xdf ' 

그래서 그것이 내가 무슨 생각을하지 않았다.

sentence = "The German word is: %s" %(ger,) 
to_print = sentence.encode(stdout_encoding) 
to_print = to_print.replace('?','') 

>>> print(to_print) 
The German word is: süß 

가 SO 주셔서 감사합니다 :) *

2

파일을 열고 읽을 때 유니 코드가 아닌 8 비트 문자열이 생성됩니다. 유니 코드 문자열을 얻으려면 대신 파일을 열 codecs.open를 사용 : 물론

f=codecs.open(filename, 'r', 'utf-8') 

을 파일 대신 'iso-8859-15'를 사용해야 작성 방법에 따라.

편집 : 하나의 테스트 코드와 주석 처리 된 코드의 차이는 테스트가 단일 문자열이지만 파일에서 읽기가 목록을 생성한다는 것입니다. 아마도 당신의 문제는 유니 코드와 전혀 관련이 없습니다. 테스트 코드에서이 대체을 시도하고이 같은 오류가 발생하는 경우 참조 :

text = [u'süß'] 

는 불행하게도, 난 더 이상 도와 파이썬에서 SQL과 충분한 경험이 없다.

또한 단일 문자열 대신 list을 인쇄하면 유니 코드 문자가 해당 이스케이프 시퀀스로 바뀝니다. 문자열이 실제로 어떻게 보이는지 보려면 한 번에 하나씩 인쇄하십시오. 호기심이 있다면 __str____repr__의 차이점입니다.

편집 2 : 문자 u'\ufeff'Byte Order Mark or BOM으로 알려져 있으며 일부 편집자가 파일이 실제로 UTF-8임을 나타 내기 위해 삽입되었습니다. 문자열을 사용하기 전에 제거해야합니다. 파일의 맨 처음에 하나만 있어야합니다. 예 : Reading Unicode file data with BOM chars in Python

+0

질문에 대한 자세한 내용을 추가했습니다. – Amin

+0

@Amin, 다음 번에 질문에 세부 사항을 추가했다고 말하면 ** 수정 후 ** 수행하십시오. 나는 내가 직접 편집하기 전에 완전히 그것을 놓쳤다. –

+0

팁에 대한 혼란과 감사에 대한 사과. – Amin