環境情報
- OS:CentOS 7.7(64bit)
- Python:3.6.8 (yumでインストール)
- Django:2.2.7
- mod_wsgi:4.6.8
発生した現象
csvファイルを保存する処理を実行するコードをメイン関数でCUIから実行した場合は、日本語を含むファイル名でも保存できるが、同じ処理をDjangoから呼び出した場合、ファイルのopen関数でasciiで扱えないコードが入っているというエラーが発生する。
Print文ではエラーにならず、今のところOpen関数だけで確認している現象。
Windows環境ではDjangoでもエラーにならない。
コード
python
1 def saveCsv(self, key_word) : 2 filename=os.path.join(self.output_path, 'csv') 3 with open(filename, 'w', encoding='SJIS') as fp: 4 fp.write('検索キーワード:{}\n'.format(key_word)) 5 for word_1 in self.getList(key_word): 6 fp.write('・{}\n'.format(word_1)) 7 for word_2 in self.getList(key_word + word_1): 8 fp.write(',{}\n'.format(word_2)) 9
エラーが発生するのはopen関数。※write関数ではない。
ファイル名に日本語が含まれているときだけエラーになる。(asciiしか使えなくなってる)
ファイルの先頭に「# -- coding: utf-8 --」をつけても変化しない。
setting.pyのDEFAULT_CHARSETを指定しても変化しない。(そもそもデフォルトはUTF8)
考察
理由は不明だが、Linux環境でDjangoを使うとどこかでシステム的なアクセスにasciiのみしか使えなくなる制限がかかる様子。
ただ、CUIで呼び出しても再現しないので、mod_wsgiの問題かもしれない。
ファイルの書き込みはSJISを指定して書き込んでおり、それについては日本語が含まれていても問題なく書き込めるので、文字コードが扱えないわけではない。
知りたいこと
回避方法があれば教えてほしいです。
エラーメッセージ(追記)
Internal Server Error: /create_csvfile, referer: http://testhost/result Traceback (most recent call last):, referer: http://testhost/result File "/python/venv/lib/python3.6/site-packages/django/core/handlers/exception.py", line 34, in inner, referer: http://testhost/result response = get_response(request), referer: http://testhost/result File "/python/venv/lib/python3.6/site-packages/django/core/handlers/base.py", line 115, in _get_response, referer: http://testhost/result response = self.process_exception_by_middleware(e, request), referer: http://testhost/result File "/python/venv/lib/python3.6/site-packages/django/core/handlers/base.py", line 113, in _get_response, referer: http://testhost/result response = wrapped_callback(request, *callback_args, **callback_kwargs), referer: http://testhost/result File "/python/venv/lib/python3.6/site-packages/django/views/decorators/csrf.py", line 54, in wrapped_view, referer: http://testhost/result return view_func(*args, **kwargs), referer: http://testhost/result File "/my_app/main/views.py", line 29, in create_csvfile, referer: http://testhost/result google_maping_obj.saveCsv(keyword), referer: http://testhost/result File "/my_app/scraping/get_csvfile.py", line 56, in saveCsv, referer: http://testhost/result with open(filename, 'w', encoding='SJIS') as fp:, referer: http://testhost/result UnicodeEncodeError: 'ascii' codec can't encode characters in position 69-76: ordinal not in range(128), referer: http://testhost/result , referer: http://testhost/result
回答1件
あなたの回答
tips
プレビュー