鱼C论坛

 找回密码
 立即注册
查看: 871|回复: 15

[已解决]29讲,课程内容里面的题,运行无结果

[复制链接]
发表于 2020-3-26 17:06:24 | 显示全部楼层 |阅读模式

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

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

x
#小甲鱼的对话单独保存为boy_*.txt,去掉”小甲鱼:“
#小客服的对话单独保存为girl_*.txt,去掉”小客服:“
#文件中一共有三段对话,分别保存为boy_1.txt,boy_2.txt,boy_3.txt
#以及girl_1.txt,girl_2.txt,girl_3.txt共6个文件
f=open(r"C:\Users\Administrator\Desktop\python\record.txt","r")
f.seek(0,0)                                          #从文件头开始
string=f.read()                                      #讲txt里面的东西赋值给字符串string

def variation(range_1,count):
     i=0
     sign=[0]  
     while string[i]!= '=':
        for i in range(range_1,len(string)):
            if string[i]=='\n' and  "小客服:" in string[max(sign):i]:
               boy='boy_'+str(count)+'.txt'
               boy_file=open(boy,'w+')               #+4的目的是避免将”小甲鱼:“,”小客服:“放入文件中               
               boy_file.write(string[max(sign)+4:i]) #max(sign)找最大值,越往后的换行符的位置参数越大,就是离当前换行符最近的那一个换行符的位置
               i+=1                                  #跳过第二个换行符,开始新一轮判别,原因如下
               sign.append(i)                        #存放换行符的位置,换行符是有每个句子结尾和句子开头都有一个换行符,例如‘女朋友?\n\n小甲鱼:咦???\n\n小客服:我跟:’
            else:                                        
               if string[i]=='\n' and  "小甲鱼:" in string[max(sign):i] :
                   girl='girl'+str(count)+'.txt'
                   girl_file=open(girl,'w+')
                   girl_file.write(string[max(sign)+4:i])
                   i+=1
                   sign.append(i)
     print('location=',i)                            #输出当前出现‘=’的位置
                                                                               
variation(0,1)                               
location_1=location                                  #存放第一次出现‘=’的位置
if string[location_1]=='=':                          #循环跳过所有的‘=’符号之后,在开始存放数据
   location_1+=1
else:
    variation(location_1,2)
    location_2=location                              #存放第2次出现‘=’的位置
    if string[location_2]=='=':                      #循环跳过所有的‘=’符号之后,在开始存放数据
         location_2+=1           
    else:
       variation(location_2,3)          
                                      
f.close()
boy_1.close()
boy_2.close()
boy_3.close()
girl_1.close()
girl_2.close()
girl_3.close()
最佳答案
2020-3-26 17:54:22
猪猪虾 发表于 2020-3-26 17:25
运行了一晚上,第二天报错了,显示这句有问题
if string=='\n' and  "小客服:" in string[max(sign):i] ...

没看懂你的代码,所以重写了一个
def _OpenFile(count):
    return open(f'boy_{count}.txt',mode='w'),open(f'girl_{count}.txt',mode='w')

def _Writer(path):
    file=open(path,mode='r').__iter__()
    count=1
    boy_file,girl_file=_OpenFile(count)

    while True:
        line=file.__next__()

        if line.startswith('小甲鱼'):
            boy_file.write(line[4:])

        elif line.startswith('小客服'):
            girl_file.write(line[4:])

        elif line.startswith('='):
            boy_file,girl_file=_OpenFile(count)

def main():
    try:
        _Writer(r"C:\Users\Administrator\Desktop\python\record.txt")

    except StopIteration:
        pass

    except BaseException as err:
        print(err.__repr())
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-3-26 17:10:19 | 显示全部楼层
emmm
怎么个没结果法?搞死不出答案还是报错?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-26 17:25:21 | 显示全部楼层
文件的关闭应该放到循环里面
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-26 17:25:27 | 显示全部楼层
永恒的蓝色梦想 发表于 2020-3-26 17:10
emmm
怎么个没结果法?搞死不出答案还是报错?

运行了一晚上,第二天报错了,显示这句有问题
if string[i]=='\n' and  "小客服:" in string[max(sign):i]:
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-26 17:54:22 | 显示全部楼层    本楼为最佳答案   
猪猪虾 发表于 2020-3-26 17:25
运行了一晚上,第二天报错了,显示这句有问题
if string=='\n' and  "小客服:" in string[max(sign):i] ...

没看懂你的代码,所以重写了一个
def _OpenFile(count):
    return open(f'boy_{count}.txt',mode='w'),open(f'girl_{count}.txt',mode='w')

def _Writer(path):
    file=open(path,mode='r').__iter__()
    count=1
    boy_file,girl_file=_OpenFile(count)

    while True:
        line=file.__next__()

        if line.startswith('小甲鱼'):
            boy_file.write(line[4:])

        elif line.startswith('小客服'):
            girl_file.write(line[4:])

        elif line.startswith('='):
            boy_file,girl_file=_OpenFile(count)

def main():
    try:
        _Writer(r"C:\Users\Administrator\Desktop\python\record.txt")

    except StopIteration:
        pass

    except BaseException as err:
        print(err.__repr())
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-26 17:59:43 | 显示全部楼层
BngThea 发表于 2020-3-26 17:25
文件的关闭应该放到循环里面
#小甲鱼的对话单独保存为boy_*.txt,去掉”小甲鱼:“
#小客服的对话单独保存为girl_*.txt,去掉”小客服:“
#文件中一共有三段对话,分别保存为boy_1.txt,boy_2.txt,boy_3.txt
#以及girl_1.txt,girl_2.txt,girl_3.txt共6个文件
f=open(r"C:\Users\Administrator\Desktop\python\record.txt","r")
f.seek(0,0)                                          #从文件头开始
string=f.read()                                      #讲txt里面的东西赋值给字符串string

def variation(range_1,count):
     i=0
     sign=[0]  
     while string[i] != '=':
        for i in range(range_1,len(string)):
            if string[i]=='\n' and  "小客服:" in string[max(sign):i]:
               boy='boy_'+str(count)+'.txt'
               boy_file=open(boy,'w+')               #+4的目的是避免将”小甲鱼:“,”小客服:“放入文件中               
               boy_file.write(string[max(sign)+4:i]) #max(sign)找最大值,越往后的换行符的位置参数越大,就是离当前换行符最近的那一个换行符的位置
               i+=1                                  #跳过第二个换行符,开始新一轮判别,原因如下
               sign.append(i)                        #存放换行符的位置,换行符是有每个句子结尾和句子开头都有一个换行符,例如‘女朋友?\n\n小甲鱼:咦???\n\n小客服:我跟:’
            else:                                        
               if string[i]=='\n' and  "小甲鱼:" in string[max(sign):i] :
                   girl='girl'+str(count)+'.txt'
                   girl_file=open(girl,'w+')
                   girl_file.write(string[max(sign)+4:i])
                   i+=1
                   sign.append(i)
     print('location=',i)                            #输出当前出现‘=’的位置
                                                                               
variation(0,1)
boy_1.close()
girl_1.close()
location_1=location                                  #存放第一次出现‘=’的位置
if string[location_1]=='=':                          #循环跳过所有的‘=’符号之后,在开始存放数据
   location_1+=1
else:
    variation(location_1,2)
    boy_2.close()
    girl_2.close()
    location_2=location                              #存放第2次出现‘=’的位置
    if string[location_2]=='=':                      #循环跳过所有的‘=’符号之后,在开始存放数据
         location_2+=1           
    else:
       variation(location_2,3)          
       boy_3.close()
       girl_3.close()
       
f.close()






#现在显示回溯(最后调用):
#  File "C:\Users\Administrator\Desktop\python\29_fenduan.py", line 29, in <module>
 #   variation(0,1)
  #File "C:\Users\Administrator\Desktop\python\29_fenduan.py", line 12, in variation
   # while string[i] != '=':
#IndexError: string index out of range
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-26 18:02:35 | 显示全部楼层
你的代码中必须遇到 = 才结束循环,这里没遇到,并且后面没有字符了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-26 18:08:33 | 显示全部楼层
BngThea 发表于 2020-3-26 18:02
你的代码中必须遇到 = 才结束循环,这里没遇到,并且后面没有字符了

所以在第三次运行的时候,会一直运行下去,停不下来
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-26 18:09:18 | 显示全部楼层
永恒的蓝色梦想 发表于 2020-3-26 17:54
没看懂你的代码,所以重写了一个

好的,谢谢,大概懂你的思路了,我的太繁琐了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-26 18:16:19 | 显示全部楼层
猪猪虾 发表于 2020-3-26 18:09
好的,谢谢,大概懂你的思路了,我的太繁琐了

选个最佳好不好
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-26 18:22:41 | 显示全部楼层
BngThea 发表于 2020-3-26 18:02
你的代码中必须遇到 = 才结束循环,这里没遇到,并且后面没有字符了

老师,我改了一下,在第三次分割的时候,我不调用程序了,将循环里面的东西复制了一遍,放在第三种情况里面,但是还是报同一个地方同样
#小甲鱼的对话单独保存为boy_*.txt,去掉”小甲鱼:“
#小客服的对话单独保存为girl_*.txt,去掉”小客服:“
#文件中一共有三段对话,分别保存为boy_1.txt,boy_2.txt,boy_3.txt
#以及girl_1.txt,girl_2.txt,girl_3.txt共6个文件
f=open(r"C:\Users\Administrator\Desktop\python\record.txt","r")
f.seek(0,0)                                          #从文件头开始
string=f.read()                                      #讲txt里面的东西赋值给字符串string

def variation(range_1,count):
     i=0
     sign=[0]  
     while string[i] != '=':
        for i in range(range_1,len(string)):
            if string[i]=='\n' and  "小客服:" in string[max(sign):i]:
               boy='boy_'+str(count)+'.txt'
               boy_file=open(boy,'w+')               #+4的目的是避免将”小甲鱼:“,”小客服:“放入文件中               
               boy_file.write(string[max(sign)+4:i]) #max(sign)找最大值,越往后的换行符的位置参数越大,就是离当前换行符最近的那一个换行符的位置
               i+=1                                  #跳过第二个换行符,开始新一轮判别,原因如下
               sign.append(i)                        #存放换行符的位置,换行符是有每个句子结尾和句子开头都有一个换行符,例如‘女朋友?\n\n小甲鱼:咦???\n\n小客服:我跟:’
            else:                                        
               if string[i]=='\n' and  "小甲鱼:" in string[max(sign):i] :
                   girl='girl'+str(count)+'.txt'
                   girl_file=open(girl,'w+')
                   girl_file.write(string[max(sign)+4:i])
                   i+=1
                   sign.append(i)
     print('location=',i)                            #输出当前出现‘=’的位置
                                                                               
variation(0,1)
boy_1.close()
girl_1.close()
location_1=location                                  #存放第一次出现‘=’的位置
if string[location_1]=='=':                          #循环跳过所有的‘=’符号之后,在开始存放数据
   location_1+=1
else:
    variation(location_1,2)
    boy_2.close()
    girl_2.close()
    location_2=location                              #存放第2次出现‘=’的位置
    if string[location_2]=='=':                      #循环跳过所有的‘=’符号之后,在开始存放数据
         location_2+=1           
    else:

#----------------------------情况三----------------------------------------------
         
       for i in range(location_2,len(string)):
            if string[i]=='\n' and  "小客服:" in string[max(sign):i]:
               boy='boy_'+str(count)+'.txt'
               boy_file=open(boy,'w+')                           
               boy_file.write(string[max(sign)+4:i])
               i+=1                                  
               sign.append(i)                        
            else:                                        
               if string[i]=='\n' and  "小甲鱼:" in string[max(sign):i] :
                   girl='girl'+str(count)+'.txt'
                   girl_file=open(girl,'w+')
                   girl_file.write(string[max(sign)+4:i])
                   i+=1
                   sign.append(i)
       boy_3.close()
       girl_3.close()
       
f.close()
的错误
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-26 18:24:15 | 显示全部楼层

我还是想知道我的啥地方有问题
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-26 18:28:11 | 显示全部楼层
猪猪虾 发表于 2020-3-26 18:24
我还是想知道我的啥地方有问题

嘛……其实我觉得你写代码之前应该先写一个框架,再完成代码,到时候自己写的哪有问题基本也能清楚
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-26 18:41:05 | 显示全部楼层
永恒的蓝色梦想 发表于 2020-3-26 18:28
嘛……其实我觉得你写代码之前应该先写一个框架,再完成代码,到时候自己写的哪有问题基本也能清楚{:10_3 ...

感谢你的建议,这样也方便别人看
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-26 18:46:39 | 显示全部楼层
猪猪虾 发表于 2020-3-26 18:22
老师,我改了一下,在第三次分割的时候,我不调用程序了,将循环里面的东西复制了一遍,放在第三种情况里 ...

因为string读进来的字符串是有长度的,你的循环里面i一直在增加,而没有合理的跳出,导致越界
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-26 21:48:17 | 显示全部楼层
BngThea 发表于 2020-3-26 18:46
因为string读进来的字符串是有长度的,你的循环里面i一直在增加,而没有合理的跳出,导致越界

我这程序问题真是多,我加了一个条件,改成
while string[i] != '=' and i <= len(string):
同样的地方还是有问题
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-24 22:38

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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