pandas dataframe을 .to_csv했을 때, 깨짐/encording error가 나왔을 때의 대처법
소개
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(サロゲート領域の代理バイト列に置き換える)
등 있다고 합니다.
Reference
이 문제에 관하여(pandas dataframe을 .to_csv했을 때, 깨짐/encording error가 나왔을 때의 대처법), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/noa_28/items/1b6dc76014878f4bd971
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
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
# 一度ファイルオブジェクトをエラー無視して、書き込みで開くようにする
with open("./output/test.csv", mode="w", encoding="shift-jis", errors="ignore") as f:
# ここでデータフレームを開いたファイルにcsvで書き込む
df.to_csv(f)
Reference
이 문제에 관하여(pandas dataframe을 .to_csv했을 때, 깨짐/encording error가 나왔을 때의 대처법), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/noa_28/items/1b6dc76014878f4bd971텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)