鱼C论坛

 找回密码
 立即注册
查看: 2296|回复: 7

[已解决]029讲:文件,一个任务相关问题

[复制链接]
发表于 2020-3-1 00:47:44 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
这是文档:
小客服:小甲鱼,今天有客户问你有没有女朋友?
小甲鱼:咦??
小客服:我跟她说你有女朋友了!
小甲鱼:。。。。。。
小客服:她让你分手后考虑下她!然后我说:"您要买个优盘,我就帮您留意下~”
小甲鱼:然后呢?
小客服:她买了两个,说发一个货就好~
小甲鱼:哦。。。。。。你真牛!
小客服:那是,谁让我是鱼C最可爱小客服嘛~
小甲鱼:下次有人想调戏你我不阻止~
小客服:滚!!!
=====================================================
小客服:小甲鱼,有个评论很好笑哈。
小甲鱼:哦?
小客服:“有了小甲鱼,以后妈妈再也不用担心我的学习了~”
小甲鱼:哈哈哈,我看到丫,我还发微博了呢~
小客服:嗯嗯,我看了你的微博丫~
小甲鱼:呦西~
小客服:那个有条回复“左手拿着小甲鱼,右手拿着打火机,哪里不会点哪里,so easy^_^”
小甲鱼:T_T
=====================================================
小客服:小甲鱼,今天一个会员想找你
小甲鱼:哦?什么事?
小客服:他说你一个学生月薪已经超过12K了!!
小甲鱼:哪里的?
小客服:上海的
小甲鱼:那正常,哪家公司?
小客服:他没说呀。
小甲鱼:哦
小客服:老大,为什么我工资那么低啊??是时候涨涨工资了!!
小甲鱼:啊,你说什么?我在外边呢,这里好吵吖。。。。。。
小客服:滚!!!

这是test1
f = open('record.txt','r',encoding='utf-8')

boy = []
girl = []
count = 1

for each_line in f:
    if each_line[:6] != '======':
        (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()

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

f.close()

这是test2
def save_file(boy,girl,count):
    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()


def split_file(file_name):

    boy = []
    girl = []
    count = 1

    f = open(file_name)

    for each_line in f:
        if each_line[:6] != '=======':
            (role,line_spoken) = each_line.spoken(':',1)
            if role == '小甲鱼':
                boy.append(line_spoken)
            if role == '小客服':
                girl.append(line_spoken)
        else:
            save_file(boy,girl,count)

            boy = []
            girl = []
            count += 1
        
    save_file(boy,girl,count)

    f.close()

split_file('record.txt')



提问:原文档和代码中我都按照英文‘:’来的然后test1运行后idle报错:
Traceback (most recent call last):
  File "D:\python编写\test_1.py", line 9, in <module>
    (role, line_spoken) = each_line.split(':', 1)
ValueError: not enough values to unpack (expected 2, got 1)
但是可以得到正常的_1,_2文件没有_3文件
运行test2 不报错但是只能得到_1文件,文件还是个空的

通宵在线等 谢谢带个带姐萌
最佳答案
2020-3-1 02:00:07
本帖最后由 jackz007 于 2020-3-1 02:04 编辑

      问题应该出在文件 "record.txt" 最后可能有空行存在,这个代码要求这个文件中不可以有任何一个空行。所有的内容只能是两种形式之一,一种是文本中至少有一个 ':' 字符,另一种就是文本内容由至少 6 个连续的 '=' 字符开头,否则,就会发生楼主所说的那种错误。

      可以用我整理的代码试:
  1. #-*-coding:gbk-*-

  2. f = open('record.txt')

  3. boy , girl , count = [] , [] , 1
  4. for each_line in f:
  5.     if each_line[:6] != '======':
  6.         (role , line_spoken) = each_line . split(':' , 1)
  7.         if role == '小甲鱼':
  8.             boy . append(line_spoken)
  9.         if role == '小客服':
  10.             girl . append(line_spoken)
  11.     else:
  12.         file_name_boy = 'boy_' + str(count) + '.txt'
  13.         file_name_girl = 'girl_' + str(count) + '.txt'

  14.         boy_file = open(file_name_boy ,'w')
  15.         girl_file = open(file_name_girl ,'w')

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

  18.         boy_file . close()
  19.         girl_file . close()

  20.         boy , girl , count = [] , [] , count + 1
  21.         
  22. file_name_boy = 'boy_' + str(count) + '.txt'
  23. file_name_girl = 'girl_' + str(count) + '.txt'

  24. boy_file = open(file_name_boy ,'w')
  25. girl_file = open(file_name_girl ,'w')

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

  28. boy_file . close()
  29. girl_file . close()

  30. f . close()
复制代码


        如果出现文件编码错误,就把这一句
  1. f = open('record.txt')
复制代码

        改成这样
  1. f = open('record.txt' , encoding = 'UTF-8')
复制代码

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-3-1 01:12:19 | 显示全部楼层
f = open('record.txt','r',encoding='utf-8')
变量f不是字符串,你可以用type(f)看一下,f是io.TextIOWrapper,应该在open之后用text = f.read(),text 才是你需要的字符串
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-1 01:37:31 | 显示全部楼层
Python3005 发表于 2020-3-1 01:12
f = open('record.txt','r',encoding='utf-8')
变量f不是字符串,你可以用type(f)看一下,f是io.TextIOWra ...

for each_line in f:,each_line就已经是每行的字符串了。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-1 01:45:58 | 显示全部楼层
txxcat 发表于 2020-3-1 01:37
for each_line in f:,each_line就已经是每行的字符串了。

修改之后确实不报错了但是只能生成_1的txt文档
并且文档是空的
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-1 02:00:07 | 显示全部楼层    本楼为最佳答案   
本帖最后由 jackz007 于 2020-3-1 02:04 编辑

      问题应该出在文件 "record.txt" 最后可能有空行存在,这个代码要求这个文件中不可以有任何一个空行。所有的内容只能是两种形式之一,一种是文本中至少有一个 ':' 字符,另一种就是文本内容由至少 6 个连续的 '=' 字符开头,否则,就会发生楼主所说的那种错误。

      可以用我整理的代码试:
  1. #-*-coding:gbk-*-

  2. f = open('record.txt')

  3. boy , girl , count = [] , [] , 1
  4. for each_line in f:
  5.     if each_line[:6] != '======':
  6.         (role , line_spoken) = each_line . split(':' , 1)
  7.         if role == '小甲鱼':
  8.             boy . append(line_spoken)
  9.         if role == '小客服':
  10.             girl . append(line_spoken)
  11.     else:
  12.         file_name_boy = 'boy_' + str(count) + '.txt'
  13.         file_name_girl = 'girl_' + str(count) + '.txt'

  14.         boy_file = open(file_name_boy ,'w')
  15.         girl_file = open(file_name_girl ,'w')

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

  18.         boy_file . close()
  19.         girl_file . close()

  20.         boy , girl , count = [] , [] , count + 1
  21.         
  22. file_name_boy = 'boy_' + str(count) + '.txt'
  23. file_name_girl = 'girl_' + str(count) + '.txt'

  24. boy_file = open(file_name_boy ,'w')
  25. girl_file = open(file_name_girl ,'w')

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

  28. boy_file . close()
  29. girl_file . close()

  30. f . close()
复制代码


        如果出现文件编码错误,就把这一句
  1. f = open('record.txt')
复制代码

        改成这样
  1. f = open('record.txt' , encoding = 'UTF-8')
复制代码

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

使用道具 举报

 楼主| 发表于 2020-3-1 02:03:41 | 显示全部楼层
jackz007 发表于 2020-3-1 02:00
问题应该出在文件 "record.txt" 最后可能有空行存在,这个代码要求这个文件中不可以有任何一个空行。 ...

谢谢大佬深夜解答
生成空文件是因为我之前也不知道怎么回事record里的内容全都丢失了
并且test2中我比较粗心(role,line_spoken) = each_line.split(':',1)
打成了(role,line_spoken) = each_line.spoken(':',1)
问题已经全部解决了 谢谢大佬们
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-1 02:05:13 | 显示全部楼层
jackz007 发表于 2020-3-1 02:00
问题应该出在文件 "record.txt" 最后可能有空行存在,这个代码要求这个文件中不可以有任何一个空行。 ...

f = open('record.txt',encoding='utf-8')
我的系统是win10 不加上utf-8读不出来
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-1 02:59:54 | 显示全部楼层
    首先test2代码有错,(role,line_spoken) = each_line.spoken(':',1),应该是(role,line_spoken) = each_line.spilt(':',1),修正后才能运行。
    然后来说说我的模拟结果,当文本保存为utf-8格式的时候,运行test1成功,test2会报编码错误。保存ansi格式的时候,test1会报编码错,test2尽然出现了“ValueError: not enough values to unpack (expected 2, got 1)”的错误,费了点功夫才发现原来还有一个地方错了,if each_line[:6] != '=======':,后面有7个等号,多了一个,所以返回值必然是True,等号那行会进入下一行split,因为没有冒号所以split返回只有1个值就报了那个错,修正过来运行正常。
    回过头来分析一下你的问题,test1可以成功运行大部分,说明文件应该是utf-8格式的,所以test2打开是无法正确读取的,程序问什么不会报错,是个问题,我加了一段try-except忽略掉报错后,运行结果和你说的一样了,出现了2个_1的空文件:
    try:
        for each_line in f:
            if each_line[:6] != '======':
                (role,line_spoken) = each_line.split(':',1)
                if role == '小甲鱼':
                    boy.append(line_spoken)
                if role == '小客服':
                    girl.append(line_spoken)
            else:
                save_file(boy,girl,count)

                boy = []
                girl = []
                count += 1
    except:
        pass

    为什么你的test2不会报错,不解!希望有人能找出问题所在。
    最后分析一下test1的问题,能生成1和2号文件,报错生成不了第3号文件,问题应该出在第三段文字,但开始的测试是没问题的,想必问题出在结尾,于是在文档最后加了一行空格(只要一个空格就行),再运行,完美重现错误:报ValueError错,生成了_1、_2文件。你检查一下你的文档是否多一行空格,删掉后应该正常。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-3-1 16:58

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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