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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

Python 3.x

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

Q&A

解決済

1回答

2002閲覧

Django:cannot use a string pattern on a bytes-like object

bunks

総合スコア30

Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

Python 3.x

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

0グッド

0クリップ

投稿2018/08/27 07:18

編集2018/08/27 15:11

https://github.com/o-tomox/TextGenerator
のコードをPython3で使えるようにし,Djangoアプリ内で動かそうとすと,以下のようなエラーがました。

cannot use a string pattern on a bytes-like object

コマンドラインから実行する分には,全くエラーなしに動くのですが,どうしてDjangoではこのようなエラーが出るのでしょうか?

環境は
Python 3.6.3
Django 2.2.dev20180610131139
(必要なモジュールはインストールし,基本的に最新版です。)

エラーコードおよび動作している周辺のコードは以下の通りです。

/Users/Usename/webapp/app/views.py in sample triplet_freqs = chain.make_triplet_freqs() ... ▼ Local vars Variable Value chain <app.models.PrepareChain object at 0x10dcfc978> request <WSGIRequest: GET '/sample?your_name=%E6%96%87%E7%AB%A0%E3%82%92%E5%85%A5%E5%8A%9B%E3%81%97%E3%81%A6%E3%81%8F%E3%81%A0%E3%81%95%E3%81%84'> text (b'\xe6\x96\x87\xe7\xab\xa0\xe3\x82\x92\xe5\x85\xa5\xe5\x8a\x9b\xe3' b'\x81\x97\xe3\x81\xa6\xe3\x81\x8f\xe3\x81\xa0\xe3\x81\x95\xe3\x81\x84') ------------------------------------ /Users/Usename/webapp/app/models.py in make_triplet_freqs def make_triplet_freqs(self): u""" 形態素解析から3つ組の出現回数まで @return 3つ組とその出現回数の辞書 key: 3つ組(タプル) val: 出現回数 """ # 長い文章をセンテンス毎に分割 sentences = self._divide(self.text) ... # 3つ組の出現回数 triplet_freqs = defaultdict(int) # センテンス毎に3つ組にする for sentence in sentences: ▼ Local vars Variable Value self <app.models.PrepareChain object at 0x10dcfc978> ------------------------------------ /Users/Usename/webapp/app/models.py in _divide @param text 分割前の文章 @return 一文ずつの配列 """ # 改行文字以外の分割文字(正規表現表記) delimiter = u"。|.|." # 全ての分割文字を改行文字に置換(splitしたときに「。」などの情報を無くさないため) text = re.sub(u"({0})".format(delimiter), r"\1\n", text) ... # 改行文字で分割 sentences = text.splitlines() # 前後の空白文字を削除 sentences = [sentence.strip() for sentence in sentences] ▼ Local vars Variable Value delimiter '。|.|\.' self <app.models.PrepareChain object at 0x10dcfc978> text (b'\xe6\x96\x87\xe7\xab\xa0\xe3\x82\x92\xe5\x85\xa5\xe5\x8a\x9b\xe3' b'\x81\x97\xe3\x81\xa6\xe3\x81\x8f\xe3\x81\xa0\xe3\x81\x95\xe3\x81\x84') -------------------------------------- /Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/re.py in sub def sub(pattern, repl, string, count=0, flags=0): """Return the string obtained by replacing the leftmost non-overlapping occurrences of the pattern in string by the replacement repl. repl can be either a string or a callable; if a string, backslash escapes in it are processed. If it is a callable, it's passed the match object and must return a replacement string to be used.""" return _compile(pattern, flags).sub(repl, string, count) ▼ Local vars Variable Value count 0 flags 0 pattern '(。|.|\.)' repl '\1\n' string (b'\xe6\x96\x87\xe7\xab\xa0\xe3\x82\x92\xe5\x85\xa5\xe5\x8a\x9b\xe3' b'\x81\x97\xe3\x81\xa6\xe3\x81\x8f\xe3\x81\xa0\xe3\x81\x95\xe3\x81\x84')

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

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

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

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

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

guest

回答1

0

ベストアンサー

リンクされているgithubのコード自体はpython2のコードのようです。

コマンドラインで動いているpythonコマンドはpython2なのでは。

投稿2018/08/27 11:43

hayataka2049

総合スコア30933

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

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

bunks

2018/08/27 12:11

回答ありがとうございます。 python3に直した後に作業しています。説明不足すみません。
hayataka2049

2018/08/27 12:18

とりあえずエラーのスタックトレースを追記してくださいな
hayataka2049

2018/08/27 12:19

あと、呼び出しているところとかのコードも
bunks

2018/08/27 15:15

追記しました。データベースとかも関連しているのでしょうか…
hayataka2049

2018/08/27 17:00 編集

エラー自体は正規表現モジュールのところから出ているようですね。 text = re.sub(ur"({0})".format(delimiter), r"\1\n", text) の行で、textがbytesのようです。 __init__の if isinstance(text, str): text = text.decode("utf-8") self.text = text をちゃんと直しましたか? python2のstrはpython3のbytesです
bunks

2018/08/28 01:34

if を消去して text = text.decode("utf-8") self.text = text のみにしたところうまくいきました。 ありがとうございます!
hayataka2049

2018/08/28 01:51

それでとりあえず動きはすると思いますが、必ずbytesを入力しないといけないコードになるので微妙ですね if isinstance(text, bytes): とするか、 そもそもpython3なら「必ずstrを渡す」というルールにして、モジュールに渡すときにbytesなら明示的にstrに変換する、というスタイルでコーディングするのが良いかと
bunks

2018/08/28 08:58

ご指摘いただいたエラーが出たので,if文を使ったところ解消されました。 ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問