pandas dataframe을 .to_csv했을 때, 깨짐/encording error가 나왔을 때의 대처법

7273 단어 CSV파이썬pandas

소개



dataframe을 .to_csv로 csv로 만들고 데이터를 엑셀로 열 때,
데이터의 일본어 부분이 깨져 &enconding error가 나와 버렸으므로,
그 때의 대처법 비망록으로서 써 두고 싶습니다.

환경: MacOS Catalina

일반 CSV 내보내기 (데이터에 일본어가 포함되어 있지 않은 경우)


import pandas as pd

df = pd.DataFrame([
  ["1", "taro"],
  ["2", "hanako"]],
  columns=['id', 'name'])

# test.csvとして出力
df.to_csv("test.csv")



물론 출력된 파일을 엑셀로 열어도 문자화되지 않는다.

깨져 버린다 (데이터에 일본어가 들어있는 경우)


import pandas as pd

df = pd.DataFrame([
  ["1", "太郎"],
  ["2", "花子"]],
  columns=['id', '名前'])

# test.csvとして出力
df.to_csv("test.csv")



일본어에서만 문자 깨짐

문자가 깨졌을 때의 대책


import pandas as pd

df = pd.DataFrame([
  ["1", "太郎"],
  ["2", "花子"]],
  columns=['id', '名前'])

# test.csvとして出力 encodingに"shift-jis"を指定。
df.to_csv("test.csv",encoding="shift-jis")

encoding을 아무것도 설정하지 않는 경우는, 자동적으로 "utf-8"라고 하는 문자 코드가 설정되어 버린다고 한다.
그것을 shift-jis로 설정하면 문자 깨짐이 제거됩니다!


문자 깨는 해소되었지만, enconding error가 나왔다・・・



다른 데이터 프레임(Windows에서 작성한 엑셀을 받아들인 것)도 똑같이, 받아들여, 여러가지 처리를 한 후,
.to_csv를 사용하여 csv로 시도했을 때 다음 오류가 발생합니다.
import pandas as pd

# エクセルが置いてあるファイルパスを指定
filepaths = glob('./*.xlsx')
# 読み込んだエクセルを読み込む。読み込んだエクセルには、\n、¥n、\u0020などエスケープシーケンスが入った文字が多く入っている。
df = pd.read_excel(filepaths[0],engine='openpyxl')

...dfに対しての色々な処理(省略)....

# test.csvとして出力 encodingに"shift-jis"を指定。上と同じ。
df.to_csv("test.csv",encoding="shift-jis")

발생한 오류
File "pandas/_libs/writers.pyx", line 49, in pandas._libs.writers.write_csv_rows
UnicodeEncodeError: 'shift_jis' codec can't encode character '\u2161' in position 54: illegal multibyte sequence

\u2161이라는 문자가, encoding로 지정한 문자 코드, 이번은 shift-jis에서는
할당하지 않은 문자로 인해 오류가 발생했습니다.

그 경우는 다음과 같이 쓰면 해소되었습니다.
    # 一度ファイルオブジェクトをエラー無視して、書き込みで開くようにする
    with open("./output/test.csv", mode="w", encoding="shift-jis", errors="ignore") as f:
        # ここでデータフレームを開いたファイルにcsvで書き込む
        df.to_csv(f)
errors="ignore" 에서 잘못된 바이트 열을 무시하도록 지정합니다.mode="w" 로 쓰기(write)라는 지정을 하고 있습니다.
errors 옵션은 replace(無効なバイト列を?に置き換える)backslashreplace(無効なバイト列にバックスラッシュを添える) ,surrogateescape(サロゲート領域の代理バイト列に置き換える) 등 있다고 합니다.

좋은 웹페이지 즐겨찾기