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

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

新規登録して質問してみよう
ただいま回答率
85.50%
Python 3.x

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

Q&A

解決済

2回答

7162閲覧

Python3で'AttributeError: 'int' object has no attribute 'strip''が出てしまう。

oka12

総合スコア8

Python 3.x

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

0グッド

2クリップ

投稿2018/08/16 16:09

編集2018/08/17 15:50

現在HP(http://sandmark.hateblo.jp/entry/2017/10/09/040243)を参考に、人工知能を作ろうと思っています。
その途中でpythonファイルの中身をコマンドプロンプトで実行しようとすると件名のようなエラーが出てきます。
エラーの詳細は

>>> from dictionary import Dictionary >>> dict = Dictionary() Traceback (most recent call last): File "<stdin>", line 1, in <module> File "C:\Users\聡一朗\repos\unmo\dictionary.py", line 24, in __init__ pattern, phrases = line.strip().split('\t') AttributeError: 'int' object has no attribute 'strip'

です。下記にdictionary.pyとdics_pattern.txtを掲載しておきます。

dictionary.py class Dictionary: """思考エンジンの辞書クラス。 クラス変数: DICT_RANDOM -- ランダム辞書のファイル名 DICT_PATTERN -- パターン辞書のファイル名 プロパティ: random -- ランダム辞書 pattern -- パターン辞書 """ DICT_RANDOM = 'dics_random.txt' DICT_PATTERN = 'dics_pattern.txt' def __init__(self): """ファイルから辞書の読み込みを行う。""" with open(Dictionary.DICT_RANDOM, encoding='utf-8') as f: self._random = [x for x in f.read().splitlines() if x] self._pattern = [] with open(Dictionary.DICT_PATTERN, encoding='utf-8') as f: for line in f: pattern, phrases = line.strip().split('\t') if pattern and phrases: self._pattern.append({'pattern': pattern, 'phrases': phrases}) @property def random(self): """ランダム辞書""" return self._random @property def pattern(self): """パターン辞書""" return self._pattern
dics_pattern.txt チョコ(レート)? %match%おいしいよね|食べ過ぎると太るよ! 天気 明日晴れるといいなー

エラーが示す該当行や参照しているdics_pattern.txtには数字らしきものはないのになぜ'int'が含まれたこのようなエラーが出るのでしょうか。

------------以下追記-----------------

pdbモジュールを使用してデバックしたところ、lineの中身がdics_pattern.txtの{チョコ(レート)? %match%おいしいよね|食べ過ぎると太るよ!}となっていることが判明しました。とするとおそらく文字列を分割する役目を持つsplit関数が何らかの原因で動作しないため、{ValueError: not enough values to unpack (expected 2, got 1)}というエラーが出ると思われます。ちなみに件名のAttributeErrorの方はなぜだか出なくなりました。

気になる質問をクリップする

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

LouiS0616

2018/08/16 16:19

実際に print(type(line), line) してみてはいかがですか。また、環境を再起動してみましたか。
hayataka2049

2018/08/16 19:10

一見した限りでは問題なさそうなので、コードの確認と実際にlineに入っているものの確認(LouiS0616さんのprintする方法で良いです)を行ってデバッグしてください
oka12

2018/08/17 15:49

print(type(line), line)は質問の追記にもありますが、AttributeErrorと同じ行に出るValueErrorに妨げられて使えないため、pdbモジュールを使いました。
guest

回答2

0

自己解決

追記のValueErrorの方も解決しました。

>>> from dictionary import Dictionary >>> dict = Dictionary() Traceback (most recent call last): File "<stdin>", line 1, in <module> File "C:\Users\聡一朗\repos\unmo\dictionary.py", line 24, in __init__ pattern, phrases = line.strip().split('\t') ValueError: not enough values to unpack (expected 2, got 1)

上記のコードはAttributeErrorと最後の一行だけが異なります。

解決方法としては、pattern, phrases = line.strip().split('\t')のsplit('\t')の正規表現{\t}と
dics_pattern.txtの{チョコ(レート)? %match%おいしいよね}の?と%の間の正規表現の表記の仕方が異なっていたためでした(仮に\tに合わせるならば、?と%の間も\tにしなければなりません)。
ちなみに正規表現について僕が学んだHP(https://www.sejuku.net/blog/13215)も良ければ使ってください。

投稿2018/08/17 17:12

oka12

総合スコア8

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

エラー発生箇所は line.strip().split('\t') ですね。

動かしてないんですが、パッと見た感じその1行上の for line in f: は、
for line in f.read().splitlines(): と書くのが正しそうです。

ここが for line in f: だと、さらに4行上の内包表記
[x for x in f.read().splitlines() if x] とやってることに一貫性が無いです。

投稿2018/08/16 19:03

編集2018/08/16 19:09
set0gut1

総合スコア2413

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hayataka2049

2018/08/16 19:09

pythonのファイルオブジェクトはイテレータとしても使えるので、どちらでも書けるというパターンですね
set0gut1

2018/08/16 19:32

hayatakaさんありがとうございますmm fをイテレートすると確かに各行(+末尾改行)がstringとして取れますね。 謎が深いのでクリップしました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問