Rinsama10
@Rinsama10 (Rin R)

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!

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

解決したいこと

pythonでpythonパーフェクトマスターを見ながら、会話botをつくっています。

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

Traceback (most recent call last):
File "ptna_from.py", line 7, in
ptna = Ptna('ptna')
File "C:\Users\momom\ptna\ptna_ptna.py", line 7, in init
self.dictionary = Dictionary()
File "C:\Users\momom\ptna\dictionary.py", line 31, in init
ptn,prs=line.split('\t')
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('\t')
            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) 

自分で試したこと

Errorの意味を調べたり、何度も見直しました。

0

3Answer

既にご確認済みでしたら申し訳ありません。
出版社から版毎の正誤表が提供されています。
特に第1版第1刷の訂正は多数あるようです。

1Like

Comments

  1. @Rinsama10

    Questioner

    わざわざURLをありがとうございます。第2版でした(T_T)こちらこそ申し訳ないです。
  2. @Rinsama10

    Questioner

    なるほど!!みんなどうやってるんだろうって思ってました!!
    ありがとうございます!次から使用させていただきます🌟
        for line in self.new_lines:
            ptn,prs=line.split('\t')
            self.pattern.append(ParseItem(ptn,prs))

ソースコード全体が見えないと正確なことは言えませんが、エラーメッセージを邦訳すると
ValueError: not enough values to unpack (expected 2, got 1)
不正な値: アンパックするのに十分な値がありません。(2個が期待されていますが、1個しか得られませんでした)
ということになります。

pythonにおいてアンパックとは、代入文の右辺にリストやタプルなどを置いて、左辺の複数の変数に分割して代入することを指します

参考)https://note.nkmk.me/python-tuple-list-unpack/

本ソースコードで具体的に言うと、

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

この代入文がやろうとしていることは、右辺line.split('\t')の結果が2個(以上)の要素を持つリストになるだろうと期待した上で、それぞれptn, prsという2つの変数に代入しようとしてします。

しかし、右辺のline.split('\t')の結果が要素を1個しか持たなかったため、該当のエラーが表示されています。

line.split('\t')lineという文字列を\tで分割してリストを得る関数ですから、その結果の要素が1個しかないということは、line\tが含まれていないということが分かります。


提供されたソースコードからはlineself.new_linesに何が入っているのか分からないため、分かることは以上になります。

まだ問題が解決しないようでしたら、self.new_linesの内容がわかるソースコードを追記していただければ力になれるかもしれません。

1Like

Comments

  1. @Rinsama10

    Questioner


    @bigen1925様 ご回答いただきありがとうございます。

    すごくわかりやすかったです。
    追記いたしました。解決できないため、お助けいただきたいです(´;ω;`)
    宜しくお願いいたします。

以下は手元に書籍がない状態で回答しているので、その点ご了承ください。

self.new_linesにはpattern.txtというファイルの各行が代入されているようですね

ですので、いずれかのfor line in self.new_lines\tが含まれていないということは、pattern.txtの全行のうちいずれかに\tが含まれていないということを意味しています。

pattern.txtの全ての行に\tが含まれているか確認してみてください。

1Like

Comments

  1. いいですね!

    可愛いウサギさんでほっこりしました ^0^

Your answer might help someone💌