2017-01-24 6 views
0

私の開発環境をミラーリングする新しいMacサーバでプロダクト環境を設定しています。仕事は私のdevのコンピュータ上で支障なく実行されますが、サーバー上で、私はこのトレースバックを取得しています:Dictwriter.writerowsを使用している場合のCSVモジュール「UnicodeEncodeError」

Traceback (most recent call last): 
    File "/usr/local/share/Code/PycharmProjects/etl3/jira_scripts/jira_issues_incremental.py", line 189, in <module> 
    writer.writerows(rows) 
    File "/usr/local/bin/anaconda3/envs/etl3/lib/python3.5/csv.py", line 156, in writerows 
    return self.writer.writerows(map(self._dict_to_list, rowdicts)) 
UnicodeEncodeError: 'ascii' codec can't encode character '\u2019' in position 1195: ordinal not in range(128) 

このジョブはAutomator AppでRun Shell Script端子を介して実行されています。 Automater端末のsys.defaultencoding()と、マシン自体を確認しました。すべてはutf8と言います。私はPostgreSQLデータベースのエンコーディングもチェックしており、それもUTF8に設定されています。ここでDictwriterがに書き込みをしていること、ファイルのための私のopen文です:私も、すべてのデフォルトのエンコーディングが正しいように見えるので、このエラーを追跡するために開始する場所に、わずか困惑

with open(loadfile, 'w') as outf: 
     writer = csv.DictWriter(
      f=outf, 
      delimiter='|', 
      fieldnames=fieldnames, 
      extrasaction='ignore', 
      escapechar=r'/', 
      quoting=csv.QUOTE_MINIMAL 
     ) 
     writer.writerows(rows) 

は...このファイルはpsycopg2.cursor.copy_fromコマンドを使用してPostgreSQLデータベースにコピーされているので、そのファイルはそれと互換性のあるモードで書き込まれる必要があります。

答えて

1

ファイルにエンコードを指定していないため、システムにはデフォルトのコーデックが使用されています。現在はASCIIです。 open() documentationを参照してください:エンコーディングが使用するエンコーディングを指定されていない場合は、テキストモードで

はプラットフォームに依存します:locale.getpreferredencoding(False)は、現在のロケールのエンコーディングを取得するために呼び出されます。

代わりに別のコーデックを指定してください。 UTF-8は動作します:

with open(loadfile, 'w', encoding='utf8') as outf: 

sys.getdefaultencoding()はここでは適用されません。それは非修飾のstr.encode()呼び出しのデフォルトに過ぎません。

関連する問題