pandas

【Pandas】日本語が含まれるファイルの読み込みと保存

日本語の含まれるファイルを読み書きする場合、文字コードに気を付ける必要がある。

特に、ファイルの読み書きがコンピュータだけでなく、人間がExcelなどを使ってファイル編集する場合などは、注意が必要となる。

ファイルを扱うのがコンピュータのみの場合は、基本的に文字コードをUTF-8にしておけば問題ない。

しかし、人がExcelでファイルを編集する可能性がある場合、文字コードがUTF-8だと日本語が文字化けして正常に表示されない。

BOM付のUTF-8にしてやることで、Excelでも日本語が文字化けせず、かつコンピュータでもUTF-8として認識可能となる。

なお本記事でのファイル読み書きはpandasでCSVを扱うことを前提とする。

Pythonの標準エンコーディングの種類

Python標準エンコーディング

UTF-8やShift_SJIS、cp932などの使える文字コード名が掲載されている。

表に記載されている通り、各文字コードの指定方法は1種類ではなく、別名も定義されているため、大体それっぽく書けば、エラーになることは少ない(と思う)。

UTF-8 BOM付でファイルを保存する

文字コードをUTF-8BOM付に指定するだけ。

import pandas as pd

data1 = ["あ", "い", "う", "え", "お"]
data2 = ["a", "b", "c", "d", "e"]
data3 = [1, 2, 3, 4, 5]

df = pd.DataFrame(data={"列A": data1,
                        "列B": data2,
                        "列C": data3})
print(df)
>>
  列A 列B  列C
0  あ  a   1
1  い  b   2
2  う  c   3
3  え  d   4
4  お  e   5
# UTF-8 BOM付でCSV保存
df.to_csv("./data/sample_utf8_with_bom.csv", index=False, encoding="utf_8_sig")

encodingに「utf_8_sig」を指定することでBOM付のUTF-8で保存できる。

この方法で保存したCSVファイルをExcelで開いても、日本語が文字化けせずに表示される。

Excelでファイルを編集して保存し、プログラムからファイルを読み込んでも、文字コードがUTF8なので、文字化けを気にせずに読み込める。

UTF-8 BOM付ファイルの読み込み

ファイル読み込み時のデフォルトの文字コードがUTF8なので、ファイル読み込み時は特に文字コードを指定しなくても、読み込める。

# 文字コード指定なし
df2 = pd.read_csv("./data/sample_utf8_with_bom.csv")

# 文字コードにUTF-8を指定
df3 = pd.read_csv("./data/sample_utf8_with_bom.csv", encoding="utf8")

# 文字コードにUTF-8BOM付を指定
df4 = pd.read_csv("./data/sample_utf8_with_bom.csv", encoding="utf_8_sig")

print(df2)
print(df3)
print(df4)
>>
  列A 列B  列C
0  あ  a   1
1  い  b   2
2  う  c   3
3  え  d   4
4  お  e   5

どの方法で読み込んでも正常に読み込める。

まとめ

import pandas as pd

# UTF-8 BOM付で保存
df.to_csv("./sample.csv", encoding="utf_8_sig")

# UTF-8 BOM付ファイルの読み込み
# 文字コードの指定は不要
df = pd.read_csv("./sample.csv")