2013-07-17 10 views
1

나는 파일에 쓰기 위해 노력하고있어 나는 다음과 같은 오류 얻을 :unicodeError를 피하는 방법은 무엇입니까?

나는 그들의 이름을 집계 된 파일에 대한 상담의 데이터베이스에서 행을 작성하려고 후 오류가 발생
Traceback (most recent call last): 
    File "/private/var/folders/jv/9_sy0bn10mbdft1bk9t14qz40000gn/T/Cleanup At Startup/merge-395780681.888.py", line 151, in <module> 
    gc_all_d.writerow(row) 
    File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/csv.py", line 148, in writerow 
    return self.writer.writerow(self._dict_to_list(rowdict)) 
UnicodeEncodeError: 'ascii' codec can't encode character u'\u0329' in position 5: ordinal not in range(128) 

:

# compile master spreadsheet 
with(open('gc_all.txt_3','w')) as gc_all: 
    gc_all_d = csv.DictWriter(gc_all, fieldnames = fieldnames, extrasaction='ignore', delimiter = '\t') 
    gc_all_d.writeheader() 
    for row in aicep_l: 
     print row['name'] 
     gc_all_d.writerow(row) 
    for row in nbcc_l: 
     gc_all_d.writerow(row) 
     print row['name'] 

저는 여기 생소한 해역에 있습니다. writerow() 메서드에서이 문자 '\ u0329'로 인코딩 범위를 넓힐 수있는 매개 변수가 표시되지 않습니다.

나는이 오류가 nameparser 모듈을 사용하여 모든 상담원의 이름을 같은 형식으로 구성한다는 사실과 관련이 있다고 생각합니다. nameparser에서 가져온 HumanName 함수는 유니 코드를 나타 내기 위해 선도자 'u'와 함께 상담원의 이름을 쓸 수 있습니다. 즉 'Sam the Man'대신 'Man the Man'출력이 인식되지 않습니다.

도움 주셔서 감사합니다. 답변에 따라


ERROR 다음과 같은 수정 :

# nbcc 
with(open('/Users/samuelfinegold/Documents/noodle/gc/nbcc/nbcc_output.txt', 'rU')) as nbcc: 
    nbcc_d = csv.DictReader(nbcc, delimiter = '\t') 
    nbcc_l = [] 
    for row in nbcc_d: 
#   name = HumanName(row['name']) 
#   row['name'] = name.title + ' ' + name.first + ' ' + name.middle + ' ' + name.last + ' ' + name.suffix  
     row['phone'] = row['phone'].translate(None, whitespace + punctuation) 
     nbcc_l.append(row) 

개정 코드 :

# compile master spreadsheet 
with(open('gc_all.txt_3','w')) as gc_all: 
    gc_all_d = csv.DictWriter(gc_all, fieldnames = fieldnames, extrasaction='ignore', delimiter = '\t') 
    gc_all_d.writeheader() 
    for row in nbcc_l: 
     row['name'] = row['name'].encode('utf-8') 
     gc_all_d.writerow(row) 
,536,913

File "/private/var/folders/jv/9_sy0bn10mbdft1bk9t14qz40000gn/T/Cleanup At Startup/merge-395782963.700.py", line 153, in <module> 
    row['name'] = row['name'].encode('utf-8') 
UnicodeDecodeError: 'ascii' codec can't decode byte 0xcc in position 11: ordinal not in range(128) 

코드 만드는 이름의 모든 균일 엔트리 63,210

오류 : docs에서

Traceback (most recent call last): 
    File "/private/var/folders/jv/9_sy0bn10mbdft1bk9t14qz40000gn/T/Cleanup At Startup/merge-395784700.086.py", line 153, in <module> 
    row['name'] = row['name'].encode('utf-8') 
UnicodeDecodeError: 'ascii' codec can't decode byte 0xcc in position 11: ordinal not in range(128) 
logout 
+0

가능한 [파이썬에서 영어 및 힌디어 문자로 구문 분석 csv 파일] (http://stackoverflow.com/questions/17661093/parsing-csv-file-with-english-and-hindi-characters-in-python) – abarnert

+0

아마도 여기와 목표물에 관련된 질문의 절반도 될 것입니다. – abarnert

답변

4

:

This version of the csv module doesn’t support Unicode input. Also, there are currently some issues regarding ASCII NUL characters. Accordingly, all input should be UTF-8 or printable ASCII to be safe; see the examples in section Examples.

당신은 그것을 쓰기 전에 데이터를 인코딩해야합니다 - 같은 :

for row in aicep_1: 
    print row['name'] 
    for key, value in row.iteritems(): 
     row[key] = value.encode('utf-8') 
    gc_all_d.writerow(row) 

을 또는 포트폴리오 2.7에 다시, 당신은 사전 이해를 사용할 수 있습니다 :

for row in aicep_1: 
    print row['name'] 
    row = {key, value.encode('utf-8') for key, value in row.iteritems()} 

또는 문서의 예제 페이지에서 좀 더 정교한 패턴을 사용하십시오.

+0

행의 '/ private/var/folders/jv/9_sy0bn10mbdft1bk9t14qz40000gn/T/Cleanup At Startup/merge-395782963.700.py "줄 153 행의 [행의 이름] UTF-8 ') UnicodeDecodeError :'ascii '코덱은 11 위치에서 0xcc 바이트를 디코딩 할 수 없습니다. 서수가 범위 내에 없습니다 (128) – goldisfine

+0

전체 컨텍스트는 무엇입니까? 이미 설명 된 내용과 같이 이미 인코딩 된 것을 가지고 다시 인코딩하려고하면 이런 일이 발생할 수 있습니다. http://stackoverflow.com/questions/9644099/python-ascii-codec-cant-decode-byte -에 따라 달라집니다. 어디에서 행을 얻고 있습니까? –

+0

음, 전체 컨텍스트 ... 그래서이 실행 : for row in nbcc_l: # print type(row) row['name'] = row['name'].encode('utf-8') gc_all_d.writerow(row 및 모든 행 형식 = '유니 코드'입니다. 따라서 오류가 같은지 확실하지 않습니다. – goldisfine

2

은 무엇 당신이 가진 것은 출력 스트림 (당신의 gc_all.txt_3 파일,의 with 줄에 열 변수 gc_all의 인스턴스를 스트림) 파이썬은 ASCII만을 보유 없어야합니다 믿고있다. 유니 코드 문자 '\ u0329'를 사용하여 유니 코드 문자열을 작성하도록 요청했습니다. 예 :

>>> s = u"foo\u0329bar" 
>>> with open('/tmp/unicode.txt', 'w') as stream: stream.write(s) 
... 

Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
UnicodeEncodeError: 'ascii' codec can't encode character u'\u0329' in position 3: 
ordinal not in range(128) 

각 문자열에 명시적인 .encode을 수행하는 등 많은 옵션이 있습니다. http://docs.python.org/2/howto/unicode.html에 설명 된대로 또는, (3.X는 조금 다른 내가 파이썬 2.x는 있으리라 믿고있어) codecs.open 사용하여 파일을 열 수 있습니다

>>> import codecs 
>>> with codecs.open('/tmp/unicode.txt', 'w', encoding='utf-8') as stream: 
...  stream.write(s) 
... 
>>> 

편집 추가 : @ 피터 DeGlopper의 답변에 따라, 명시적인 encode이 더 안전 할 수 있습니다.UTF-8에는 인코딩에 NUL이 없으므로 UTF-8을 원한다고 가정하면 보통 일 수 있고 일 수 있습니다.