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

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

ただいまの
回答率

90.46%

  • Python 3.x

    10312questions

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

Pandas read_csv後のprint()でKeyError

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 860

Yukiya025

score 69

Pandasを使ってcsvファイルを読み込んでprint()で表示しようとしています。
csvファイルの中身はロシア語 (encoding="utf-8-sig")です。

エラー文

KeyError: ('Ру', 'Ном')

 開発環境

  • Python 3.6.5
  • Atom
  • Windows7

 read_csv後のprint()でKeyError

問題のコード

import pandas as pd
csv_input = pd.read_csv(filepath_or_buffer= r'C:\Users\\ayumusato\Documents\ProgrammingStudy\coding\\26and1.csv', encoding="utf-8-sig", sep=",")
print(csv_input.size)
print(csv_input[["Ру", "Ном"]])

csvファイルの中身
CSV

 望む出力結果

['Ру', 'Ном']
['это', 44]
['как', 44]
['солдат', 32]
...
...

 試したこと

print(csv_input[["Ру"], ["Ном"]])と書いてみる。
ちなみに、このcsvファイルをメモ帳で開くとこのように表示されます。
memo
csvファイルなら普通это,44...のようにコンマ区切りで表示されると思うのですが。。。
よろしくお願いします<(_ _)>

 できましたー!

csvファイルの整形後、csvファイルの文字コードをSHIFT-JISに指定、encoding="shift_jis"へ変更
ロシア語なのにshift_jisでOKなのはなぜ笑

import pandas as pd
csv_input = pd.read_csv(filepath_or_buffer= r'C:\Users\\ayumusato\Documents\ProgrammingStudy\coding\\26and1.csv', encoding="shift_jis", sep=",")
print(csv_input.columns)
print(csv_input[["Ру", "Ном"]])

出力結果

Index(['Ру', 'Ном'], dtype='object')
         Ру  Ном
0       это   44
1       как   44
2    солдат   32
3   человек   22
4       нея   21
5      мочь   20
6    пекарь   18
7      друг   18
8  говорить   18
9     такой   18
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

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

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

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+2

追記
うろ覚えですが、以前の質問の中のどこかで、ロシア語を使っているから(UTF-8-sig)にしているとのことでしたが、-sigとは「バイト・オーダー・マーク」、通称「 BOM 」と呼ばれるものです。
これはWindowsのメモ帳などで保存すると付きます。
メモ帳で作ったファイルを別のテキストエディタで開くとUTF8-BOMなどと表示されます。
なのでロシア語だからUTF-8-sigというのは勘違いされてるのではと思いました。
ロシア語でも日本語でもUTF-8はUTF-8のはずです。
Unicodeの「Uni」は、「統一」という意味です。

Python Tips: Python で UTF-8 の BOM ありなしを見分けたい
文字コードUTF-8とは? 仕組みとコード表
文字コードをUTF-8 BOMなし(UTF-8N)でファイル保存をする方法

ちなみに、このcsvファイルをメモ帳で開くとこのように表示されます。
csvファイルなら普通это,44...のようにコンマ区切りで表示されると思うのですが。。。

pandasでcsv/tsvファイル読み込み(read_csv, read_table)
詳説Pandasのread_csvとread_table関数の使い方

参考URLの例でもカンマ区切り+改行区切りのcsvファイルから読み込んでいます。
因みにカンマ区切りのみの改行無し1行のcsvファイルからは読み込めません。
イメージ説明

カンマ区切り+改行で作ったサンプルデータ(UTF-8)
test_in.csv

A,B
1,あ
2,い
3,う
Ру,Ном
1,あ
2,い
3,う

コードは質問コードのpathを変更しただけです。
正常動作していますのでコードに問題は無いはずです。

イメージ説明

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

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

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

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/09/25 11:58

    opyon様、ありがとうございます(*≧∀≦)
    > 正常動作していますのでコードに問題は無いはずです。
    お墨付きありがとうございます。メモ帳でcsvファイルを開き、余計なタブやダブルクオテーションを削除しました:)

    それでも`UnicodeDecodeError: 'utf-8' codec can't decode byte 0x84`がでたので、csvファイルの文字コードを疑い、csvファイルの文字コードを`SHIFT-JIS`、`encoding="shift_jis"`に指定してきちんと表示されるようになりました!

    (ロシア語なのに`SHIFT-JIS`でOKなのはなぜなのか(・_・) 全角っぽいから?)

    キャンセル

  • 2018/09/25 12:20

    >メモ帳でcsvファイルを開き、

    Windows10などのメモ帳の保存時のデフォルトのファイル形式は、ANSI=SHIFT-JISのはずです。
    無意識に上書き保存するとANSI=SHIFT-JISになります。
    最初からUTF-8で開いた場合はUTF-8で保存されます。

    キャンセル

  • 2018/09/25 14:31

    > ロシア語でも日本語でもUTF-8はUTF-8のはずです。
    おお(゚Д゚) とすると、.pyファイルでUTF-8を指定すればよかったんですね f^^; 最初にcsvファイル確認したときUTF-8だったので。。。

    キャンセル

  • 2018/09/25 14:44

    追記で書いたように、読み込む元データがメモ帳で作成したファイルだと、UTF-8-sig = UTF-8-BOMになるということです。
    メモ帳だと保存形式でUTF-8を選択出来ますが、実際にはUTF-8-BOM形式なんです。
    メモ帳しか使っていないとすごく分かりにくいですよね。
    一般的に普及してるテキストエディタならUTF-8-BOMも見分けられます。
    お好みでメモ帳以外のテキストエディタを使うことをオススメします。

    キャンセル

+1

確かなことは言えませんが、csvの生成が失敗している雰囲気。生成に使っているコードも載せてみてください。

まずは

print(csv_input.columns)


してどうなってるか見てみるとか。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

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

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

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/09/25 12:01

    hayataka2049様、ありがとうございます(*≧∀≦)
    >print(csv_input.columns)
    文字コードを指定してなんとかIndex(['Ру', 'Ном'], dtype='object') を引き出しました! これで列のタイトル(?)が見られるんですね!

    キャンセル

  • 2018/09/25 12:10

    なんでsjisなんでしょうね
    出力するときに何も指定しないと、windows環境ではそうなるかもしれませんが
    あとは出力したcsvをエディタとかエクセルで上書き編集したときに文字コードが化けたとか?

    キャンセル

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

  • ただいまの回答率 90.46%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

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

  • Python 3.x

    10312questions

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