Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

pythonでのcsvファイル読み書きの際の文字コード ~windows環境ver~

本稿の投稿経緯

python初心者の私が、csvファイルの読み書きの際のエンコードにたまにエラーに躓くので、その内容のまとめをメモしたもの。同じく初心者向けの記事になります。なお、環境はwindows環境になります。

エラー

csvファイルの読み書きの際に、よく引っかかるエラーについて

書き込み時のエラー

エラー内容
UnicodeEncodeError: 'shift_jis' codec can't encode character '\u9ad9' in position 14: illegal multibyte sequence

shift-jisでエンコードできない文字があるよってことですね。ファイル書き込みの際にファイルの文字コードと書き込み文字の文字コードの不一致で発生します。

ちなみにコードの指定箇所はここなど。

コード例
with open(filepath, 'w', newline='', encoding='shift-jis') as f

読み込み時のエラー

エラー内容
UnicodeDecodeError: 'shift_jis' codec can't decode byte 0xee in position 0

shift-jisででコードできない文字があるよってことですね。ファイル読み込みの際にファイルの文字コードとファイルの読み込みで指定した文字コードの不一致で発生します。(もしくは、ファイルの読み込み時に指定した文字コードで読めない文字がファイルに書き込まれている。)

ちなみにコードの指定箇所はここなど。

コード例
data = pd.read_csv(filepath, encoding = 'shift-jis')

正しい文字コードの指定は?

ファイル作成、書き込み、読み込みの一連の動作をpython上でする場合は、以下の横軸通りに指定しておけば、エラーは発生しないはずです。
(ファイルの文字コードの意味は、書き込み時に指定した文字コードによって作成されるcsvの文字コードを表しています)

書き込み時の文字コード     ファイルの文字コード     読み込み時の文字コード     
UTF-8 UTF-8 UTF-8
cp932 ansi cp932
shift-jis ansi shift-jis

cp932もshift-jisもファイルだとansiだけどどっちつかうの?
cp932とshift-jisの違いは、例えば髙(はしごだか)﨑(たてさき)といった、環境依存文字が取り扱いできるかどうかの違いが一番の差かと思います。できるのがcp932になります。なので、例えば、他システムからansiのcsvファイルが連携されてくる時は、shift-jisではなく、cp392で取り込む想定にしておくほうが吉ということです。

nukorea
ブログでもちょっとした記事書いてます。
http://kotonoha-money.com/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away