@hikari-1 (4211 hikari)

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

Pykakasi -Google Colaboratory-出力エラーの解消について

仕事で漢字を読む作業を自動化したくpythonに取り組んでいる過程で、以下のような問題に直面しております。どなたか助言頂けますと幸いです。

Google ColaboratoryにてPykakasi(https://github.com/miurahr/pykakasi)を活用し漢字を自動判別しようとしておりましたが、出力に問題が起きておりますのでここにご相談させて頂いております。

実行環境は以下です。
デバイス:Windows10
開発環境:Google Colaboratory

スプレッドシートから漢字を読み込み、ローマ字に直すというコードを作成しておりますが、出力結果が通常のエラーと異なりファイルのパス(?)のようのものが出てきている状態です。

発生している問題・エラー

/usr/local/lib/python3.7/dist-packages/ipykernel_launcher.py:9: DeprecationWarning: Call to deprecated method setMode. (Old API will be removed in v3.0.) -- Deprecated since version 2.1.
  if __name__ == '__main__':
/usr/local/lib/python3.7/dist-packages/ipykernel_launcher.py:10: DeprecationWarning: Call to deprecated method getConverter. (Old API will be removed in v3.0.) -- Deprecated since version 2.1.
  # Remove the CWD from sys.path while we load stuff.
/usr/local/lib/python3.7/dist-packages/ipykernel_launcher.py:11: DeprecationWarning: Call to deprecated method do. (Old API will be removed in v3.0.) -- Deprecated since version 2.1.
  # This is added back by InteractiveShellApp.init_path()
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-96-6d3564a7d988> in <module>()
      9   kks.setMode('J', 'a')
     10   conv = kks.getConverter()
---> 11   conv.do(row1)

3 frames
/usr/local/lib/python3.7/dist-packages/deprecated/classic.py in wrapper_function(wrapped_, instance_, args_, kwargs_)
    283                 else:
    284                     warnings.warn(msg, category=category, stacklevel=_routine_stacklevel)
--> 285                 return wrapped_(*args_, **kwargs_)
    286 
    287             return wrapper_function(wrapped)

/usr/local/lib/python3.7/dist-packages/pykakasi/legacy.py in do(self, text)
    134             if mode in ("J", "E"):
    135                 w = min(i + _MAXLEN, len(text))
--> 136                 (t, l1) = self._conv[mode].convert(text[i:w])
    137 
    138                 if l1 > 0:

/usr/local/lib/python3.7/dist-packages/pykakasi/legacy.py in convert_nonh(self, text)
    302             return "", 0
    303 
--> 304         (t, l1) = self.convert_h(text)
    305         if l1 <= 0:  # pragma: no cover
    306             return "", 0

/usr/local/lib/python3.7/dist-packages/pykakasi/legacy.py in convert_h(self, itext)
    296 
    297     def convert_h(self, itext) -> Tuple[str, int]:
--> 298         return self._jconv.convert(itext)
    299 
    300     def convert_nonh(self, text):

TypeError: unhashable type: 'list'

該当するソースコード

pip install git+https://github.com/miurahr/pykakasi

from pykakasi import kakasi

from google.colab import auth
auth.authenticate_user()

import gspread
from oauth2client.client import GoogleCredentials

print(gspread.__version__)
!pip install --upgrade gspread

#実際の実行時には上記gspreadの認証と以下はセルを分けています。

gc = gspread.authorize(GoogleCredentials.get_application_default())
worksheet = gc.open_by_url('https://docs.google.com/spreadsheets/d/1pGNCrstOBL7CSb4eIcz4zNmFbDGYTAbKIFeH3VNSRFw/edit#gid=0').sheet1

row1 = worksheet.col_values(1)

for row in row1:

  kks = kakasi()
  kks.setMode('J', 'a')
  conv = kks.getConverter()
  conv.do(row1)

自分で試したこと

csvで実行した際は問題なくできていたのですが、スプレッドシートだとうまくいっていません。
Colaboratoryでは初期設定のpythonが3.7と聞いたので3.8にアップデートし、スプレッドシートもアップデートしたのですがどうやらコードに問題があるようです。
素人質問で大変恐縮なのですが、どなたかご教示頂けますと幸いです。

0 likes

3Answer

最後の行ですが、このようにする予定だったのではないですか?

  for row in row1:

    kks = kakasi()
    kks.setMode('J', 'a')
    conv = kks.getConverter()
-   conv.do(row1)
+   conv.do(row)
0Like

Comments

  1. @hikari-1

    Questioner

    この度はご返答いただき誠にありがとうございます。
    また、ご返信遅れ申し訳ございません。

    ご指摘の通りなのですが、変更しても尚、依然以下のようなエラーが出ております。
    https://gyazo.com/0e994ca3a2b74f2f34bec0851fac0398

    こちらの原因が分からないというのが本質問の趣旨です。
    分かりづらく大変申し訳ないですが、ご確認頂けますと幸いです。
  2. @hikari-1

    Questioner

    ご返信頂きまして誠にありがとうございます。

    こちらを踏まえて修正させて頂きましたが、以下のような問題が起きております。
    ご多忙の中大変恐縮ですが、以下私のソースコード拝見頂き、修正方法ご教示頂けないでしょうか?

    お手数おかけしまして大変申し訳ないですが、引き続き何卒よろしくお願い申し上げます。

以下のようなコードを記載した結果、list indices must be integers or slices, not str
というエラーが出ております。

このエラーを直すにはworkshhetをstr型から変更する必要がるかと存じますが、検索しても糸口が掴めておりません。

大変恐縮ですが、どうかご教示頂けますと幸いです。

【ソースコード】

pip install git+https://github.com/miurahr/pykakasi

import pykakasi

from google.colab import auth
auth.authenticate_user()

import gspread
from oauth2client.client import GoogleCredentials

print(gspread.__version__)
!pip install --upgrade gspread

gc = gspread.authorize(GoogleCredentials.get_application_default())
worksheet = gc.open_by_url('https://docs.google.com/spreadsheets/d/1pGNCrstOBL7CSb4eIcz4zNmFbDGYTAbKIFeH3VNSRFw/edit#gid=0').sheet1

row1 = worksheet.col_values(1)

kks = pykakasi.kakasi()
    
for row in row1:
    result = kks.convert(row)
    print(result)

result[0]['passport']

【結果】

[{'orig': '北海道', 'hira': 'ほっかいどう', 'kana': 'ホッカイドウ', 'hepburn': 'hokkaidou', 'kunrei': 'hokkaidou', 'passport': 'hokkaidou'}]
[{'orig': '青森', 'hira': 'あおもり', 'kana': 'アオモリ', 'hepburn': 'aomori', 'kunrei': 'aomori', 'passport': 'aomori'}]
[{'orig': '岩手', 'hira': 'いわて', 'kana': 'イワテ', 'hepburn': 'iwate', 'kunrei': 'iwate', 'passport': 'iwate'}]
[{'orig': '宮城', 'hira': 'みやぎ', 'kana': 'ミヤギ', 'hepburn': 'miyagi', 'kunrei': 'miyagi', 'passport': 'miyagi'}]
[{'orig': '秋田', 'hira': 'あきた', 'kana': 'アキタ', 'hepburn': 'akita', 'kunrei': 'akita', 'passport': 'akita'}]
[{'orig': '山形', 'hira': 'やまがた', 'kana': 'ヤマガタ', 'hepburn': 'yamagata', 'kunrei': 'yamagata', 'passport': 'yamagata'}]
[{'orig': '福島', 'hira': 'ふくしま', 'kana': 'フクシマ', 'hepburn': 'fukushima', 'kunrei': 'fukusima', 'passport': 'fukushima'}]
[{'orig': '茨城', 'hira': 'いばらき', 'kana': 'イバラキ', 'hepburn': 'ibaraki', 'kunrei': 'ibaraki', 'passport': 'ibaraki'}]
[{'orig': '栃木', 'hira': 'とちぎ', 'kana': 'トチギ', 'hepburn': 'tochigi', 'kunrei': 'totigi', 'passport': 'tochigi'}]
[{'orig': '群馬', 'hira': 'ぐんま', 'kana': 'グンマ', 'hepburn': 'gunma', 'kunrei': 'gunma', 'passport': 'gumma'}]
[{'orig': '埼玉', 'hira': 'さいたま', 'kana': 'サイタマ', 'hepburn': 'saitama', 'kunrei': 'saitama', 'passport': 'saitama'}]
[{'orig': '千葉', 'hira': 'ちば', 'kana': 'チバ', 'hepburn': 'chiba', 'kunrei': 'tiba', 'passport': 'chiba'}]
[{'orig': '東京', 'hira': 'とうきょう', 'kana': 'トウキョウ', 'hepburn': 'toukyou', 'kunrei': 'toukyou', 'passport': 'tokyou'}]
[{'orig': '神奈川', 'hira': 'かながわ', 'kana': 'カナガワ', 'hepburn': 'kanagawa', 'kunrei': 'kanagawa', 'passport': 'kanagawa'}]
[{'orig': '新潟', 'hira': 'にいがた', 'kana': 'ニイガタ', 'hepburn': 'niigata', 'kunrei': 'niigata', 'passport': 'niigata'}]
[{'orig': '富山', 'hira': 'とやま', 'kana': 'トヤマ', 'hepburn': 'toyama', 'kunrei': 'toyama', 'passport': 'toyama'}]
[{'orig': '石川', 'hira': 'いしかわ', 'kana': 'イシカワ', 'hepburn': 'ishikawa', 'kunrei': 'isikawa', 'passport': 'ishikawa'}]
[{'orig': '福井', 'hira': 'ふくい', 'kana': 'フクイ', 'hepburn': 'fukui', 'kunrei': 'fukui', 'passport': 'fukui'}]
[{'orig': '山梨', 'hira': 'やまなし', 'kana': 'ヤマナシ', 'hepburn': 'yamanashi', 'kunrei': 'yamanasi', 'passport': 'yamanashi'}]
[{'orig': '長野', 'hira': 'ながの', 'kana': 'ナガノ', 'hepburn': 'nagano', 'kunrei': 'nagano', 'passport': 'nagano'}]
[{'orig': '岐阜', 'hira': 'ぎふ', 'kana': 'ギフ', 'hepburn': 'gifu', 'kunrei': 'gifu', 'passport': 'gifu'}]
[{'orig': '静岡', 'hira': 'しずおか', 'kana': 'シズオカ', 'hepburn': 'shizuoka', 'kunrei': 'sizuoka', 'passport': 'shizuoka'}]
[{'orig': '愛知', 'hira': 'あいち', 'kana': 'アイチ', 'hepburn': 'aichi', 'kunrei': 'aiti', 'passport': 'aichi'}]
[{'orig': '三重', 'hira': 'みえ', 'kana': 'ミエ', 'hepburn': 'mie', 'kunrei': 'mie', 'passport': 'mie'}]
[{'orig': '滋賀', 'hira': 'しが', 'kana': 'シガ', 'hepburn': 'shiga', 'kunrei': 'siga', 'passport': 'shiga'}]
[{'orig': '京都', 'hira': 'きょうと', 'kana': 'キョウト', 'hepburn': 'kyouto', 'kunrei': 'kyouto', 'passport': 'kyouto'}]
[{'orig': '大阪', 'hira': 'おおさか', 'kana': 'オオサカ', 'hepburn': 'oosaka', 'kunrei': 'oosaka', 'passport': 'osaka'}]
[{'orig': '兵庫', 'hira': 'ひょうご', 'kana': 'ヒョウゴ', 'hepburn': 'hyougo', 'kunrei': 'hyougo', 'passport': 'hyougo'}]
[{'orig': '奈良', 'hira': 'なら', 'kana': 'ナラ', 'hepburn': 'nara', 'kunrei': 'nara', 'passport': 'nara'}]
[{'orig': '和歌山', 'hira': 'わかやま', 'kana': 'ワカヤマ', 'hepburn': 'wakayama', 'kunrei': 'wakayama', 'passport': 'wakayama'}]
[{'orig': '鳥取', 'hira': 'とっとり', 'kana': 'トットリ', 'hepburn': 'tottori', 'kunrei': 'tottori', 'passport': 'tottori'}]
[{'orig': '島根', 'hira': 'しまね', 'kana': 'シマネ', 'hepburn': 'shimane', 'kunrei': 'simane', 'passport': 'shimane'}]
[{'orig': '岡山', 'hira': 'おかやま', 'kana': 'オカヤマ', 'hepburn': 'okayama', 'kunrei': 'okayama', 'passport': 'okayama'}]
[{'orig': '広島', 'hira': 'ひろしま', 'kana': 'ヒロシマ', 'hepburn': 'hiroshima', 'kunrei': 'hirosima', 'passport': 'hiroshima'}]
[{'orig': '山口', 'hira': 'やまぐち', 'kana': 'ヤマグチ', 'hepburn': 'yamaguchi', 'kunrei': 'yamaguti', 'passport': 'yamaguchi'}]
[{'orig': '徳', 'hira': 'とく', 'kana': 'トク', 'hepburn': 'toku', 'kunrei': 'toku', 'passport': 'toku'}, {'orig': '島', 'hira': 'しま', 'kana': 'シマ', 'hepburn': 'shima', 'kunrei': 'sima', 'passport': 'shima'}]
[{'orig': '香川', 'hira': 'かがわ', 'kana': 'カガワ', 'hepburn': 'kagawa', 'kunrei': 'kagawa', 'passport': 'kagawa'}]
[{'orig': '愛媛', 'hira': 'えひめ', 'kana': 'エヒメ', 'hepburn': 'ehime', 'kunrei': 'ehime', 'passport': 'ehime'}]
[{'orig': '高知', 'hira': 'こうち', 'kana': 'コウチ', 'hepburn': 'kouchi', 'kunrei': 'kouti', 'passport': 'kochi'}]
[{'orig': '福岡', 'hira': 'ふくおか', 'kana': 'フクオカ', 'hepburn': 'fukuoka', 'kunrei': 'fukuoka', 'passport': 'fukuoka'}]
[{'orig': '佐賀', 'hira': 'さが', 'kana': 'サガ', 'hepburn': 'saga', 'kunrei': 'saga', 'passport': 'saga'}]
[{'orig': '長崎', 'hira': 'ながさき', 'kana': 'ナガサキ', 'hepburn': 'nagasaki', 'kunrei': 'nagasaki', 'passport': 'nagasaki'}]
[{'orig': '熊本', 'hira': 'くまもと', 'kana': 'クマモト', 'hepburn': 'kumamoto', 'kunrei': 'kumamoto', 'passport': 'kumamoto'}]
[{'orig': '大分', 'hira': 'おおいた', 'kana': 'オオイタ', 'hepburn': 'ooita', 'kunrei': 'ooita', 'passport': 'oita'}]
[{'orig': '宮崎', 'hira': 'みやざき', 'kana': 'ミヤザキ', 'hepburn': 'miyazaki', 'kunrei': 'miyazaki', 'passport': 'miyazaki'}]
[{'orig': '鹿児', 'hira': 'かこ', 'kana': 'カコ', 'hepburn': 'kako', 'kunrei': 'kako', 'passport': 'kako'}, {'orig': '島', 'hira': 'しま', 'kana': 'シマ', 'hepburn': 'shima', 'kunrei': 'sima', 'passport': 'shima'}]
[{'orig': '沖縄', 'hira': 'おきなわ', 'kana': 'オキナワ', 'hepburn': 'okinawa', 'kunrei': 'okinawa', 'passport': 'okinawa'}]
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-47-7404b61d9eb0> in <module>()
     10     print(result)
     11 
---> 12 result[:47]['passport']

TypeError: list indices must be integers or slices, not str
0Like

リストをスライスしたものはリストのままですので辞書として扱うことはできないといった理由のエラーです。
また、そちらのコードですとresult[:47]['passport']実行時のresultは最後に代入された沖縄の結果のみが格納されているので、他の都道府県の結果は失われてしまっています。

results = []
for row in row1:
    result = kks.convert(row)
    print(result)
    results.append(result[0])

[pref['passport'] for pref in results]
0Like

Comments

  1. @hikari-1

    Questioner

    毎度迅速なご返信頂きまして誠にありがとうございます。
    こちらのコードにてうまくいきました。

    pythonの基礎をちゃんと勉強し自らコードを書けるよう励みます。

    ご多忙の中ご対応頂き誠に感謝申し上げます。

Your answer might help someone💌