鱼C论坛

 找回密码
 立即注册
楼主: c870801

[已解决]“课时29:一个任务”程序报错求助

[复制链接]
 楼主| 发表于 2019-8-18 11:10:05 | 显示全部楼层
zltzlt 发表于 2019-8-18 10:45
把空行和其他无关的全部去掉,只留下 *:* 和 =======

我想问您 (role,speak)=each_line.split(":",1)中的1是指分隔一次吗?程序在执行for each_line in f:时它如何知道一段一段的执行呢。我后来又将师生对话不分段,结果也可以。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-8-18 11:11:09 | 显示全部楼层
你的 a.txt 应该是这样的:

  1. 师:老师让你留下来是想找你聊聊,你认为自己平时的表现怎样?
  2. 生:(手里拿着篮球,一直在拍,有点不上心。)
  3. 师:不管你以前的表现好与坏,老师现在希望你能认真起来,认真的人才是值得尊重的。其实你很聪明,我们高二了,还有一年多时间就高考了,现在努力还不晚,我们还是可以通过自己的努力改变未来的命运。只有认真的付出了,将来才能得到回报。像你现在这样天天打篮球能有什么前途?能打进NBA?只能是身体得到了锻炼,但是光有个好身体,学习不好,前途在哪里?男孩子应该有责任心,首先要对自己负责,才能对其他的事情负责。希望你能成为一个男子汉,成为有用之才,为自己的前途打下良好的基础。
  4. 生:这时虽然没有说什么话,但是已经停止了拍球,好像在想写什么。
  5. ===================================================
  6. 师:假期在家过的怎么样啊?
  7. 生:还可以。
  8. 师:都在家忙些什么啊?
  9. 生:和朋友、同学玩了几天,又找了几张感兴趣的画临摹了几张。
  10. 师:哦,是么!画画感觉吃力么?
  11. 生:不吃力,画的时候感觉还可以!
  12. 师:咱们现在回到学校上课了,要把自己的状态调整过来不要松懈!
  13. 生:我明白了,老师!
  14. ====================================================
  15. 师:最近学习怎么样啊?
  16. 生:可以。
  17. 师:可以时什么程度啊?期中考试有进步吗?
  18. 生:进步了,进步了一百名!(排名是按全年级来排的)
  19. 师:真的啊!太好了!这证明你努力了,老师真高兴,因为我的话你在意了!虽然你没有表态,但是老师相信你是个有上进心有理想的人。学习进步了,其他方面也要注意啊!不要总是跟老师作对,其实老师时为你好,你的变化其他老师也会发现的。我会一直默默的为你加油的!继续努力啊!
  20. 生:好的。您放心吧!
复制代码


代码如下(亲测不会报错):

  1. f=open("a.txt", encoding="utf-8")
  2. t=[]
  3. s=[]
  4. count=1
  5. for each_line in f:
  6.     if each_line[:5]!="=====":
  7.         (role,speak)=each_line.split(":",1)
  8.         if role=="师":
  9.             t.append(speak)
  10.         if role=="生":
  11.             s.append(speak)
  12.     else:
  13.         file_name_t="t_"+str(count)+".txt"
  14.         file_name_s="s_"+str(count)+".txt"

  15.         t_file=open(file_name_t,'w')
  16.         s_file=open(file_name_s,'w')

  17.         t_file.writelines(t)
  18.         s_file.writelines(s)

  19.         t_file.close()
  20.         s_file.close()

  21.         t=[]
  22.         s=[]
  23.         count+=1
  24.         ......
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-8-18 11:12:31 | 显示全部楼层
c870801 发表于 2019-8-18 11:10
我想问您 (role,speak)=each_line.split(":",1)中的1是指分隔一次吗?程序在执行for each_line in f:时它 ...

是的。因为换了行,each_line 就是文件的每一行(包括换行)
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-8-18 11:39:55 | 显示全部楼层
zltzlt 发表于 2019-8-18 11:11
你的 a.txt 应该是这样的:

但我运行您的代码后结果是这样的:
Traceback (most recent call last):
  File "C:\Users\Administrator\Desktop\a\3.py", line 9, in <module>
    for each_line in f:
  File "D:\python3.6.5\lib\codecs.py", line 321, in decode
    (result, consumed) = self._buffer_decode(data, self.errors, final)
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xc0 in position 3: invalid start byte
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-8-18 11:41:46 | 显示全部楼层
zltzlt 发表于 2019-8-18 11:12
是的。因为换了行,each_line 就是文件的每一行(包括换行)

那不换行的话是不是需把split()中的那个1去掉?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-8-18 11:52:02 | 显示全部楼层
c870801 发表于 2019-8-18 11:39
但我运行您的代码后结果是这样的:
Traceback (most recent call last):
  File "C:%users\Administrat ...

把 a.txt 编码方式改为 utf-8
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-8-18 11:55:35 | 显示全部楼层
zltzlt 发表于 2019-8-18 11:52
把 a.txt 编码方式改为 utf-8

Traceback (most recent call last):
  File "C:\Users\Administrator\Desktop\a\3.py", line 13, in <module>
    (role,speak)=each_line.split(":",1)
ValueError: not enough values to unpack (expected 2, got 1)
但是还是报上述错误。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-8-18 11:57:20 | 显示全部楼层
你的 a.txt 应该是这样的:

  1. 师:老师让你留下来是想找你聊聊,你认为自己平时的表现怎样?
  2. 生:(手里拿着篮球,一直在拍,有点不上心。)
  3. 师:不管你以前的表现好与坏,老师现在希望你能认真起来,认真的人才是值得尊重的。其实你很聪明,我们高二了,还有一年多时间就高考了,现在努力还不晚,我们还是可以通过自己的努力改变未来的命运。只有认真的付出了,将来才能得到回报。像你现在这样天天打篮球能有什么前途?能打进NBA?只能是身体得到了锻炼,但是光有个好身体,学习不好,前途在哪里?男孩子应该有责任心,首先要对自己负责,才能对其他的事情负责。希望你能成为一个男子汉,成为有用之才,为自己的前途打下良好的基础。
  4. 生:这时虽然没有说什么话,但是已经停止了拍球,好像在想写什么。
  5. ===================================================
  6. 师:假期在家过的怎么样啊?
  7. 生:还可以。
  8. 师:都在家忙些什么啊?
  9. 生:和朋友、同学玩了几天,又找了几张感兴趣的画临摹了几张。
  10. 师:哦,是么!画画感觉吃力么?
  11. 生:不吃力,画的时候感觉还可以!
  12. 师:咱们现在回到学校上课了,要把自己的状态调整过来不要松懈!
  13. 生:我明白了,老师!
  14. ====================================================
  15. 师:最近学习怎么样啊?
  16. 生:可以。
  17. 师:可以时什么程度啊?期中考试有进步吗?
  18. 生:进步了,进步了一百名!(排名是按全年级来排的)
  19. 师:真的啊!太好了!这证明你努力了,老师真高兴,因为我的话你在意了!虽然你没有表态,但是老师相信你是个有上进心有理想的人。学习进步了,其他方面也要注意啊!不要总是跟老师作对,其实老师时为你好,你的变化其他老师也会发现的。我会一直默默的为你加油的!继续努力啊!
  20. 生:好的。您放心吧!
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-8-18 13:00:21 | 显示全部楼层
f = open('a.txt',encoding='UTF-8')

t=[]
s=[]
count=1

for each_line in f:
    if each_line[:5]!="=====" and ':' in each_line:
        (role,speak)=each_line.split(":",1)
        if role.strip()=="师":
            t.append(speak)
        if role.strip()=="生":
            s.append(speak)

    elif each_line[:5] == "=====":
        file_name_t="t_"+str(count)+".txt"
        file_name_s="s_"+str(count)+".txt"

        t_file=open(file_name_t,'w')
        s_file=open(file_name_s,'w')

        t_file.writelines(t)
        s_file.writelines(s)

        t_file.close()
        s_file.close()

        t=[]
        s=[]
        count += 1

file_name_t="t_"+str(count)+".txt"
file_name_s="s_"+str(count)+".txt"

t_file=open(file_name_t,'w')
s_file=open(file_name_s,'w')

t_file.writelines(t)
s_file.writelines(s)

t_file.close()
s_file.close()

print('done!')
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-8-18 13:07:04 | 显示全部楼层
附加:
    for each_line in f:#这个为什么能实现一行一行的遍历呢,没明白?

循环结构(for-in)
说明:for-in也是循环结构的一种,经常用于遍历字符串、列表,元组,字典等

格式:

for x in y:
    循环体
执行流程:x依次表示y中的一个元素,遍历完所有元素循环结束
txt文本中的每一行都是一个元素,用看不见的\n分开的 所以可以遍历啊
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-8-18 15:19:20 | 显示全部楼层
5584197 发表于 2019-8-18 13:00
f = open('a.txt',encoding='UTF-8')

t=[]

但您能给我说下我那里错了呢?为什么有ValueError: not enough values to unpack (expected 2, got 1)报错呢
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-8-18 15:30:43 | 显示全部楼层
5584197 发表于 2019-8-18 13:07
附加:
    for each_line in f:#这个为什么能实现一行一行的遍历呢,没明白?

好的,多谢,但我这报错到底是哪里的问题?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-8-18 15:45:59 | 显示全部楼层
5584197 发表于 2019-8-18 13:00
f = open('a.txt',encoding='UTF-8')

t=[]

if each_line[:5]!="=====" and ':' in each_line:
为什么加上标红的这个条件呢?小宇老师例子里没有啊。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-8-18 20:21:56 | 显示全部楼层
小鱼老师的例子里,全都是规范的一句问一句答,你的a.txt里面不仅有空行,还有不带‘:’的其他内容,加上
and ':' in each_line条件就可以过滤掉没有冒号的行了啊
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-8-18 20:27:56 | 显示全部楼层    本楼为最佳答案   
你之前的报错的原因是,a.txt里有不带冒号的行,(role, line_spoken) = each_line.split(':',1)需要将each_line用冒号分割一次,变成两个字符串,然后分别赋值给role和line_spoken,由于不带冒号的行没法用冒号分割,所以只有一个值,所以程序报错说没有足够的值
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-8-18 21:47:21 | 显示全部楼层
ValueError: not enough values to unpack (expected 2, got 1)
ValueError:值不足,无法解包(应为2,得到1)
另一种得到同一种错误的方法:
>>> (a, b) = [1]
Traceback (most recent call last):
  File "<pyshell#11>", line 1, in <module>
    (a, b) = [1]
ValueError: not enough values to unpack (expected 2, got 1)
很明显,左边的列表提供的值不能满足右边元组的所有元素

>>> dir(str)
['__add__', '__class__', '__contains__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__mod__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__rmod__', '__rmul__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'capitalize', 'casefold', 'center', 'count', 'encode', 'endswith', 'expandtabs', 'find', 'format', 'format_map', 'index', 'isalnum', 'isalpha', 'isascii', 'isdecimal', 'isdigit', 'isidentifier', 'islower', 'isnumeric', 'isprintable', 'isspace', 'istitle', 'isupper', 'join', 'ljust', 'lower', 'lstrip', 'maketrans', 'partition', 'replace', 'rfind', 'rindex', 'rjust', 'rpartition', 'rsplit', 'rstrip', 'split', 'splitlines', 'startswith', 'strip', 'swapcase', 'title', 'translate', 'upper', 'zfill']
>>> help(str.split)
Help on method_descriptor:

split(self, /, sep=None, maxsplit=-1)
    Return a list of the words in the string, using sep as the delimiter string.
   
    sep
      The delimiter according which to split the string.
      None (the default value) means split according to any whitespace,
      and discard empty strings from the result.
    maxsplit
      Maximum number of splits to do.
      -1 (the default value) means no limit.
翻译:
拆分(self,/,sep=none,maxsplit=-1)
返回字符串中的单词列表,使用sep作为分隔符字符串。

九月
分隔字符串的分隔符。
无(默认值)表示根据任何空白分割,
并放弃结果中的空字符串。
最大分割
要执行的最大拆分数。
-1(默认值)表示无限制。

错误显示传递给元组的值不够。
你要将字符串分成两份应该是:
split(':', 2)
或者
split(':')
因为每个字符串只有一个冒号。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-8-18 22:48:19 | 显示全部楼层
本帖最后由 新学 于 2019-8-18 22:52 编辑

至于 for each_line in f:
可将其解读为:
文件 f 在 for 智能的控制下,文件 f 中的文本将自动按行存储在一个列表中,然后 each_line 从这个列表逐个读取元素。
可将其理解为以下代码:
# f.readlines() 返回一个列表,这个列表以 f 文件内容的每一行为元素。
lines = f.readlines()
for line in lines:

测验:
>>> f = open('file_test.txt')
>>> print(f.read())
This is a file type test file.This is a file type test file.
This is a file type test file.
                                       #这一空行是print()自带的换行符导致的       
>>> f.seek(0, 0)
0
>>> for line in f:
        print(line)

       
This is a file type test file.This is a file type test file.
                                                                               #这一空行是print()自带的换行符导致的
This is a file type test file.
                                                                               #这一空行是print()自带的换行符导致的
>>> f.seek(0, 0)
0
>>> lines = f.readlines()
>>> for line in lines:
        print(line)

       
This is a file type test file.This is a file type test file.

This is a file type test file.
                                                                       #结果与上面一致
>>> type(lines)
<class 'list'>      # lines 是列表
>>> type(f)
<class '_io.TextIOWrapper'>
>>> print(f)
<_io.TextIOWrapper name='file_test.txt' mode='r' encoding='cp936'>
# f 不是列表,却在 for 语句中起着列表的作用。或者说 for 智能地将 f 替换成 f.readlines(),至少这样说得通
# 证明 f 在 for 语句中不可能是起着字符串的作用
>>> f.seek(0, 0)
0
>>> content = f.read()
>>> for line in content:
        print(line)

       
T
h
i
s

i
s

a

.
.
.
#此处省略  n 行
>>> type(content)
<class 'str'>
# 很明显不可能是字符串。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-8-20 15:43:29 | 显示全部楼层
c870801 发表于 2019-8-18 11:07
已去掉,可还是报错,但能将第一段分隔出。

elif each_line[:5]=="====="
所以这行中前六个字符必须是====== 不能有别的
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-8-20 15:44:14 | 显示全部楼层
htygame 发表于 2019-8-20 15:43
elif each_line[:5]=="====="
所以这行中前六个字符必须是====== 不能有别的

是五个字符
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-8-20 21:59:42 | 显示全部楼层
本帖最后由 13572044595 于 2019-8-20 22:02 编辑

报错很明显,解包需要 两个值,得到 一个值~

确保你的文件:
1 -- 没有空行、换行,
2 -- 每行都有冒号 ‘:’,并且在文字中间      # ======== 除外
3 -- 中英文符号混用
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-10-25 14:47

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表