質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

2回答

1892閲覧

Pythonでファイルアップロードするファイル名の文字コードについて

limitman80

総合スコア40

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2018/06/07 04:50

編集2018/06/08 00:09

PythonでCSVファイルをアップロードしようとしているのですが、
ascii' codec can't encode characters in position・・・とエラーが発生します。

html

1<input id="file" name="file" type="file">

Python

1@app.route('/upload', methods=['POST']) 2def upload(): 3 file = request.files['file'] 4 5 _rootpath = '/tmp/' 6 _filePath = os.path.join(_rootpath , 'メンバー.csv') 7 try: 8 _file.save(_filePath) 9 except Exception as _e: 10 print(_e)

上記の_eに最初に記したエラーが入っています。
ファイル名を英数字のみにすると問題なくアップロードはされました。

そこで

Python

1_file.save(_filePath.encode('utf-8'))

としたら上記のエラーは解消されたのですが、
'bytes' object has no attribute 'write'
とエラーが表示されました。

どのような対応が必要かわかる方、教えていただけると助かります。

Traceback (most recent call last):
File "/var/www/flaskr/view/test.py", line 10, in upload
_file.save(_filePath)
File "/usr/lib/python3.6/site-packages/werkzeug/datastructures.py", line 2725, in save
dst = open(dst, 'wb')
UnicodeEncodeError: 'ascii' codec can't encode characters in position 41-44: ordinal not in range(128)

追記しました。
エラーのtracebackを出力したので追記してます。
サーバの環境はAWSのCENTOSになります。
環境変数のLANGは「ja_JP.utf8」になっています。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hayataka2049

2018/06/07 05:02

あまりにも情報が少ないので、掲載するコードを増やして、せめて_fileの型と中身がわかるようにしてください。あと、エラーのtracebackも省略せず全文掲載してください
mather

2018/06/07 05:22

_fileはどうやって定義されているのか、 saveメソッドが何をしているのか、あるいは何かのライブラリのメソッドなのか、全然わからないのでアドバイスができないですね。
guest

回答2

0

リクエストの作成に何を使うのかが不明だったため、requestsモジュールを使ってサンプルコードを書いてみました。

基本POSTでファイル送信する際は、binary化して送らないと駄目なので、そこでつまずいているのかなぁと思います。

python

1import requests 2 3 4def file_post(url:str) -> requests: 5 files = { 6 'file': open('./hoge.csv', 'rb'), 7 } 8 9 headers = { 10 'content-type': 'text/csv', 11 } 12 13 return requests.post(url, files=files, headers=headers) 14 15 16r = file_post(url="https://api.github.com/markdown/raw") 17print(r.status_code) 18print(r.headers) 19print(r.content)

投稿2018/06/07 10:45

kiwibird

総合スコア105

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

たぶん、saveメソッドの引数はファイルパスの文字列ではなく、ユニコード文字列ないしファイルオブジェクトだと思います。encode外したら行けるとかの、可能性はありますね。
それ以外のことはまったくわからないです。

投稿2018/06/07 05:04

編集2018/06/07 05:06
hayataka2049

総合スコア30933

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問