2012-07-28 2 views
1

파이썬을 사용하여 mysql 데이터베이스에서 여러 문자열을 읽고 일부 처리 후에 CSV 파일에 쓰는 중입니다. 그러나 나는 csv 파일에 나타나는 일부 완전히 쓰레기 문자를 참조하십시오. 예를 들어 gvim을 사용하여 CSV를 열면 <92>, <89>, <94> 등의 문자가 표시됩니다.출력 파일에 정크 문자 (스마트 인용 부호 등)

어떤 생각이 들었습니까? 나는 CSV에 기록하기 전에 ('UTF-8') string.encode 일을 시도하지만 UnicodeDecodeError: 'ascii' codec can't decode byte 0x93 in position 905: ordinal not in range(128)

+0

불행히도, 나는 아직 코드를 공유 할 수 없다. 정말로 필요한 경우 pseudocde를 게시 할 수 있습니다. 그것은 단순한 데이터베이스 읽기 및 몇 문자열의 연결 다음 CSV에 쓸 수 있습니다. – JZee

+3

데이터베이스에서받는 인코딩은 무엇입니까? – Amber

+0

@Amber, 기본값은? latin1_swedish_ci입니까? – JZee

답변

0

나는 결국 그것을 풀었다. 나는 mysql에 연결하기 위해 MySQLdb 파이썬 모듈을 사용하고 있었다. 방금 데이터베이스 연결을 생성하는 동안 charset=utf8use_unicode = True을 사용했습니다. 또한 MySQL 테이블의 데이터 정렬을 utf8_unicode_ci으로 변경했습니다.

file_pointer.write(my_string.encode('ascii', 'ignore')) 

나는 논리가 얼마나 소리 모르겠지만, 이것은 내가 인터넷 검색을 몇 시간 후 발굴 무엇이며, 나를 위해 작동하는 것 같다 : csv 파일 내 문자열을 작성할 때 마지막으로 사용했다.

0

UnicodeDecodeError 당신이 첫번째 바이트 즉, 파이썬이 개 시도를 인코딩하기 위해 노력하고 유니 코드로 디코딩하는 것을 의미 오류를 준 다음 지정된 인코딩 사용하여 인코딩하는 상기 데이터는 텍스트 (예없는 화상으로서 본질적 이진 데이터)이면

>>> b"€".encode('utf-8') 
Traceback (most recent call last): 
    File "<input>", line 1, in <module> 
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe2 in position 0: 
ordinal not in range(128) 

단계; 유니 코드를 사용하여 작업해야합니다. 데이터베이스 드라이버가 유니 코드를 반환하지 않으면 바이트를받은 즉시 유니 코드로 변환합니다.

파이썬 2의 csv 모듈은 바이트로만 작동합니다. UnicodeWriterthe examples 또는 유사 유니 코드로 쓸 수 있습니다.

0

< 80> ~ < 9F>의 모든 "쓰레기"문자가 있습니까? 그렇다면 Microsoft의 "Smart Quotes"(Windows-125x 인코딩) 가능성이 큽니다. 누군가 Word 또는 Outlook에서 텍스트를 작성하고 웹 응용 프로그램에 복사/붙여 넣었습니다. Latin-1과 UTF-8은이 문자를 제어 문자로 간주하며 일반적으로 텍스트 표시가 잘 리거나 (Latin-1) 또는? in-black-diamond-invalid-character (UTF- 8).

Word 및 Outlook과 일부 다른 MS 제품은 클립 보드 사용을 위해 텍스트의 UTF-8 버전을 제공합니다. < 80> ~ < 9F> 코드 대신 Smart Quotes 문자가 적절한 멀티 바이트 UTF-8 시퀀스가됩니다. 웹 페이지가 UTF-8 인 경우 일반적으로 Windows-125x 인코딩의 Smart Quote 대신 적절한 UTF-8 문자를 가져야합니다. 또한 이것은 보장 된 동작은 아니지만 "일관되게 작동하는 것"을 유의하십시오. 그것은 모두 사용 가능한 UTF-8 버전의 텍스트에 의존하며 적절하게 처리됩니다 (즉, gvim을 PC에 붙여 넣은 다음 웹 텍스트 형식으로 복사/붙여 넣기하지 않았습니다). 이것은 UTF-8로 인코딩 된 텍스트를 찾는 한 다양한 PC 응용 프로그램에서도 잘 작동합니다.

0

vim에서 수정할 수 있습니다. 예를 들어, (작은 따옴표 인) < 92> 처리

:1,$s/CNTRL-V x 92/'/g 

그래서 당신은 CNTRL 다음 V 다음 다음 92 (공백) × 없습니다 입력 할 수 있습니다. 너는 똑같이 나올거야.

:1,$s/<92>/'/g 
관련 문제