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

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

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

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

Amazon S3

Amazon S3 (Simple Storage Service)とはアマゾン・ウェブ・サービスが提供するオンラインストレージサービスです。

Q&A

解決済

PythonでAWS S3に、SJISでCSVを配置して、Excelで文字化けしないようにしたい

MOGU
MOGU

総合スコア4

Python 3.x

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

Amazon S3

Amazon S3 (Simple Storage Service)とはアマゾン・ウェブ・サービスが提供するオンラインストレージサービスです。

1回答

0グッド

0クリップ

412閲覧

投稿2022/11/25 05:06

前提

PythonでAWS S3にCSVを配置するようなシステムをlambdaで作成してます。
そのCSVがExcelですぐ見れるように、文字コードをSJISにしたいです。
何を試しても、S3からダウンロードしてExcelで開くと文字化けします。
どうしたら文字化けせずにCSVを配置することが可能でしょうか。

分かる方がいらっしゃいましたらご回答よろしくお願いいたします。

実現したいこと

AWS S3に配置したCSVをExcelで文字化けせずにすぐ見れるようにしたい。
※サクラエディタなどで開けば文字化けはしないのですが、ITに疎い方が使用するため、Excelで開くことが必須です

発生している問題・エラーメッセージ

Excelで開くと、CSVの中身が 豕ィ譁 のように文字化けしてしまう

該当のソースコード

Python

1csv = "AAA, BBB, CCC" 2csv = csv + str('\n') 3csv = csv + "AAAの中身"+ ',' 4csv = csv + "BBBの中身"+ ',' 5csv = csv + "CCCの中身" 6 7s3 = boto3.resource('s3') 8bucket = s3.Bucket(output_bucket) 9output_key = 'test.csv' 10bucket.put_object( Body=str(csv), Key=output_key, ContentType='text/csv' ) 11

試したこと### ヘディングのテキスト

① ContentType を ContentType='text/csv; charset=shift-jis' に変更して試しましたが変化がありませんでした。
② ContentType を ContentType='charset=shift-jis' に変更して試しましたが、S3へのアップはCSVという名前でできるのですが、ダウンロードしたとき強制的に.csvではなく.txtに変更されてしまいました。
③ csv = csv.encode('shift_jis') でshift_jisに直してアップを試しましたが、b'\x92\x8d\x95\xb... などの文字列のままCSVファイルになってしまい、読むことができませんでした。

補足情報(FW/ツールのバージョンなど)

Python3

以下のような質問にはグッドを送りましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

グッドが多くついた質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

回答1

1

ベストアンサー

③ csv = csv.encode('shift_jis') でshift_jisに直してアップを試しましたが、b'\x92\x8d\x95\xb... などの文字列のままCSVファイルになってしまい、読むことができませんでした。

上記を見落としてました。すでに試されていましたね。

追記前の回答

S3触ったことなく動作未検証ですがput_object(**kwargs)

Body (bytes or seekable file-like object) -- Object data.

とあるので

Body=str(csv)のかわりにBody=csv.encode('cp932')と明示的にエンコーディングしたバイトデータを渡すとよいかもしれません。

投稿2022/11/25 05:56

編集2022/11/25 06:09
can110

総合スコア36356

MOGU👍を押しています

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

回答へのコメント

MOGU

2022/11/25 06:12

Body=csv.encode('cp932') で無事Excelで開くことができました。  csv.encodeは試していたのですが、Bodyの前で行っており、Bodyのstr(csv)が邪魔をしていたようです。 put_objectでやれば大丈夫でした。 ありがとうございました! 
can110

2022/11/25 06:15 編集

> csv.encodeは試していたのですが、Bodyの前で行っており、Bodyのstr(csv)が邪魔をしていたようです。 なるほど。試したことでうまくいくはずで、ちょっと腑に落ちなかったですが納得しました。

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

ただいまの回答率
86.02%

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

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

質問する

関連した質問

同じタグがついた質問を見る

Python 3.x

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

Amazon S3

Amazon S3 (Simple Storage Service)とはアマゾン・ウェブ・サービスが提供するオンラインストレージサービスです。