CarterZhang 发表于 2020-11-23 10:01:31

split()函数,这不是我的问题吧?我照着案例写的呀

在做小甲鱼老师第29讲的任务,其中有一行:

(role,line_spoken) = each_line.split(':',1)

运行后报错:
File "F:/Programming/Python/practice/31.0/31.0.py", line 9, in file_cut
    (role,line_spoken) = each_line.split(':',1)
ValueError: not enough values to unpack (expected 2, got 1)

请问这是什么问题呀?我就是按照案例写的呀

jackz007 发表于 2020-11-23 10:06:26

本帖最后由 jackz007 于 2020-11-23 10:09 编辑

(role,line_spoken) = each_line.split(':',1)
      错误的原因是没有找到 split() 方法中给定的分隔符,红色的冒号是中文的,改西文的试试。

西瓜味的苹果 发表于 2020-11-23 10:12:33

没有足够的值取出,期望2个,得到1个,问题已经说明了,你each_line.split(":",1)只得到了一个值,要么查看你的each_line,要么查看":"是否正确

CarterZhang 发表于 2020-11-23 10:12:59

jackz007 发表于 2020-11-23 10:06
(role,line_spoken) = each_line.split(':',1)
      错误的原因是没有找到 split() 方法中给定的分隔符 ...

但我txt文档里也是中文的呀,改成西文的也同样报错

jackz007 发表于 2020-11-23 10:17:41

本帖最后由 jackz007 于 2020-11-23 10:21 编辑

CarterZhang 发表于 2020-11-23 10:12
但我txt文档里也是中文的呀,改成西文的也同样报错

       这句代码要求 each_line 也就是文件中的每一行必须至少要有一个中文分号存在,否则,就会出错。看看你的文件,是不是每一行都符合这个要求?特别是,不允许有任何的空行存在。

CarterZhang 发表于 2020-11-23 10:22:35

各位答主好,目前程序已经能运行,也找到了出错的原因,但是出错的原因让我很费解,大家如果方便,麻烦帮我看一下:
file = open('%s' %file_name)
    for each_line in file:
      if each_line[:6] != '======':
            (role,line_spoken) = each_line.split(':',1)

这是相关的几行代码,出错之前,if each_line[:5] != '====='
当把5改为6之后,程序就可以了。
我认为如果报错,也应该是if这一行报错啊,不应该是split这一行报错。
还请大佬们解答一下!

wp231957 发表于 2020-11-23 10:25:23

CarterZhang 发表于 2020-11-23 10:22
各位答主好,目前程序已经能运行,也找到了出错的原因,但是出错的原因让我很费解,大家如果方便,麻烦帮我 ...

解释器报错时都是大约上下文,当然也包含精准定位

jackz007 发表于 2020-11-23 10:26:13

         分割前应该先判断一下。这一句
(role,line_spoken) = each_line.split(':',1)
         改为这样试试
if':' in each_line :
    (role,line_spoken) = each_line.split(':',1)
      当然,后面所有涉及 role 以及 line_spoken 的文件操作也要同时纳入同一个 if 的缩进

逃兵 发表于 2020-11-23 10:42:22

CarterZhang 发表于 2020-11-23 10:22
各位答主好,目前程序已经能运行,也找到了出错的原因,但是出错的原因让我很费解,大家如果方便,麻烦帮我 ...

你现在运行正常了?
那改回
if each_line[:5] != '=====':
试试?
我测试这个地方没有问题的

附源码
f = open('record.txt')

boy = []
girl = []
count = 1

for each_line in f:
    if each_line[:5] != '=====':
      (role,line_spoken) = each_line.split(':',1)
      if role == '小甲鱼':
            boy.append(line_spoken)
      if role == '小客服':
            girl.append(line_spoken)
    else:
      file_name_boy = 'boy_'+str(count)+'.txt'
      file_name_girl = 'girl_'+str(count)+'.txt'

      boy_file = open(file_name_boy,'w')
      girl_file = open(file_name_girl,'w')

      boy_file.writelines(boy)
      girl_file.writelines(girl)

      boy_file.close()
      girl_file.close()

      boy = []
      girl = []
      count += 1

file_name_boy = 'boy_'+str(count)+'.txt'
file_name_girl = 'girl_'+str(count)+'.txt'

boy_file = open(file_name_boy,'w')
girl_file = open(file_name_girl,'w')

boy_file.writelines(boy)
girl_file.writelines(girl)

boy_file.close()
girl_file.close()

f.close()

CarterZhang 发表于 2020-11-24 10:40:08

逃兵 发表于 2020-11-23 10:42
你现在运行正常了?
那改回



答主您好,我说错了。这是相关的几行代码,出错之前,if each_line[:5] != '====='
当把5改为6之后,程序就可以了。
我之前输入的是if each_line[:5] != "======"
6个等号,问题应该是出在这。
那大佬能解释一下,明明是if这一行错了,为什么报错在下一行呢?

逃兵 发表于 2020-11-24 10:50:10

CarterZhang 发表于 2020-11-24 10:40
答主您好,我说错了。
我之前输入的是if each_line[:5] != "======"
6个等号,问题应该是出在这。


你输入错误并没有影响到if的语句,语法上是没错的
each_line[:5] != '======' 一直成立,能够运行
所以这一行不会报错

但是你输入错误会导致逻辑上的错误
导致你筛选出来的each_line不是想要的内容
在切割each_line时引发错误

苏格兰扯犊子 发表于 2020-12-10 10:55:30

这个和编辑器有关系,如果你用的是Pycharm,在运行到最后一行是为'\n',
通过if each_line[:6] != '======':进行判断,照样也能通过,但是这里面却没有‘:’,
不符合(role,line_spoken) = each_line.split(":",1)的判断标准,因此这句话会报错,
如果你在代码中加入这句话,就可以解决问题:
if each_line[:6] != '======':#分割字符串操作
            if each_line[:5] == '\n':            #判断是否为空格,跳出当前循环,即使程序处理到最后一行文字也
                                                             不会报错
                break
            (role,line_spoken) = each_line.split(":",1)
            if role == "Y":
                boy.append(line_spoken)
            if role == "C":
                girl.append(line_spoken)

犬来猫荒 发表于 2021-7-26 22:42:35

jackz007 发表于 2020-11-23 10:06
(role,line_spoken) = each_line.split(':',1)
      错误的原因是没有找到 split() 方法中给定的分隔符 ...

感谢,原来是这个原因,真大无语事件
页: [1]
查看完整版本: split()函数,这不是我的问题吧?我照着案例写的呀