morisoumsk
@morisoumsk (もり りぬ)

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!

ValueError: not enough values to unpack (expected 2, got 1)について

解決したいこと

pythonパーフェクトマスターでチャットボットを製作している超初心者です。
文字列を分割し、分割した文字列をぞれぞれ変数に代入しようとしているところでエラーが出てしまいます。解決方法もしくは、代替措置を教えてください。

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

ValueError: not enough values to unpack (expected 2, got 1)

該当するソースコード

import random
import re
class Dictionary:
    def  __init__(self):
        self.random = []
        rfile=open('random.txt','r',encoding='utf-8')
        r_line =rfile.readlines()
        rfile.close()
        self.random=[]
        for line in r_line:
            str =line.rstrip('\n')
            if (str!=''):
                self.random.append(str)
        pfile = open('pattern.txt','r',encoding='utf_8')
        p_lines = pfile.readlines()
        pfile.close()
        self.new_lines=[]
        for line in p_lines:
            str=line.rstrip('\n')
            if(str!=''):
                self.new_lines.append(str)
        self.pattern=[]
        for line in self.new_lines:
            ptn,prs=line.split(',')
            self.pattern.append(ParseItem(ptn,prs))
class ParseItem:
    SEPARATOR ='^((-?\d+)##)?(.*)$'
    def __init__(self,pattern,phrases):
        m = re.findall(ParseItem.SEPARATOR,pattern)
        self.modify=0
        if m [0][1]:
            self.modify=int(m[0][1])
        self.pattern=m[0][2]
        self.phrases=[]
        self.dic={}
        for phrase in phrases.split('|'):
            m = re.findall(ParseItem.SEPARATOR,phrase)
            self.dic['need']=0
            if m[0][1]:
                self.dic['need']=int(m[0][1])
            self.dic['phrase']=m[0][2]
            self.phrases.append(self.dic.copy())
    def match(self,str):
        return re.search(self.pattern,str)
    def choice(self,mood):
        choices=[]
        for p in self.phrases:
            if (self.suitable(p['need'],mood)):
                choices.append(p['phrase'])
        if(len(choices)==0):
            return None
        return random.choice(choices)
    def suitable(self,need,mood):
        if (need == 0):
            return True
        elif (need > 0):
            return(mood > need)
        else:
            return (mood < need) 

自分で試したこと

エラーについて何度も調べています。

0

1Answer

  1. ValueErrorが出たことしかわからず,コードのどの行でエラーが出たのかが不明なためデバッグ不可
  2. random.txtおよびpattern.txtの内容が不明なため同一の環境を用意できずデバッグ不可
  3. クラスDictionaryおよびクラスParseItemを実行する方法が不明なためデバッグ不可

質問をする側として提供べき情報量が圧倒的に不足しています.

辛うじてこのエラーが発生しそうな場所が1ヶ所存在します.

ptn, prs = line.split(',')

の行です.comma,で文字列変数lineを分割することが無かった場合,返り値は1つです.ptnおよびprsの2つ分返せると予期(expected)していたものの,文字列を分割することがなかったためエラーになりました.

わかるのはそれだけです.最初に述べたとおり解決方法もしくは代替措置のための情報が不足しております.提案するとしても,分割可能なケースと不可能なケースで場合分けをしたらいいのでは.ぐらいしかありません.

あと余談ですが,等号=や比較演算子!=の前後にスペースがある場合とない場合があり統一されていないことや,comma後のスペースもないなどコーディング規約を守れていない点も指摘しておきます.なんなら予約語であるstrを13行目で変数として使っている点も理解不能です.

1Like

Your answer might help someone💌