1

ファイルに書き込もうとすると、次のエラーが発生します。

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']

私はここでなじみのない海にいます。この文字 '\u0329' にエンコーディング範囲を広げることができる writerow() メソッドのパラメーターが見つかりません。

このエラーは、nameparser モジュールを使用してすべてのカウンセラーの名前を同じ形式に整理しているという事実と関係があると思います。nameparser からインポートされた HumanName 関数は、カウンセラーの名前を先頭に 'u' を付けて Unicode を示すように書き出す場合があります。これは、総出力が 'Sam the Man' ではなく u'Sam the Man' であることを意味します。

助けてくれてありがとう!


回答に基づく修正後のエラー:

  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)

すべての名前エントリを統一するコード:

# 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)

エラー:

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
4

2 に答える 2

4

ドキュメントから:

このバージョンの csv モジュールは Unicode 入力をサポートしていません。また、現在、ASCII NUL 文字に関していくつかの問題があります。したがって、すべての入力は安全のために UTF-8 または印刷可能な ASCII にする必要があります。セクション例の例を参照してください。

データを書き込む前に、次のようにエンコードする必要があります。

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()}

または、ドキュメントのサンプル ページにあるより洗練されたパターンを使用してください。

于 2013-07-17T19:28:51.657 に答える
2

あなたが持っているのは、PythonがASCIIだけを保持する必要があると信じている出力ストリーム(行gc_all.txt_3で開かれたファイル、withvariable のストリームインスタンス)です。gc_allUnicode 文字 '\u0329' を使用して Unicode 文字列を書き込むように要求しました。例えば:

>>> 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.htmlcodecs.openで説明されているようにファイルを開くこともできます(Python 2.x を想定していますが、3.x は少し異なります)。

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

編集して追加: @Peter DeGlopper の回答に基づいて、明示的な方encodeが安全な場合があります。UTF-8 のエンコーディングには NUL がないため、UTF-8 が必要であると仮定すると (通常は必要です)、これで問題ない可能性があります。

于 2013-07-17T19:36:05.463 に答える