鱼C论坛

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

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

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

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

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

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

  8. def variation(range_1,count):
  9.      i=0
  10.      sign=[0]  
  11.      while string[i]!= '=':
  12.         for i in range(range_1,len(string)):
  13.             if string[i]=='\n' and  "小客服:" in string[max(sign):i]:
  14.                boy='boy_'+str(count)+'.txt'
  15.                boy_file=open(boy,'w+')               #+4的目的是避免将”小甲鱼:“,”小客服:“放入文件中               
  16.                boy_file.write(string[max(sign)+4:i]) #max(sign)找最大值,越往后的换行符的位置参数越大,就是离当前换行符最近的那一个换行符的位置
  17.                i+=1                                  #跳过第二个换行符,开始新一轮判别,原因如下
  18.                sign.append(i)                        #存放换行符的位置,换行符是有每个句子结尾和句子开头都有一个换行符,例如‘女朋友?\n\n小甲鱼:咦???\n\n小客服:我跟:’
  19.             else:                                       
  20.                if string[i]=='\n' and  "小甲鱼:" in string[max(sign):i] :
  21.                    girl='girl'+str(count)+'.txt'
  22.                    girl_file=open(girl,'w+')
  23.                    girl_file.write(string[max(sign)+4:i])
  24.                    i+=1
  25.                    sign.append(i)
  26.      print('location=',i)                            #输出当前出现‘=’的位置
  27.                                                                               
  28. variation(0,1)                              
  29. location_1=location                                  #存放第一次出现‘=’的位置
  30. if string[location_1]=='=':                          #循环跳过所有的‘=’符号之后,在开始存放数据
  31.    location_1+=1
  32. else:
  33.     variation(location_1,2)
  34.     location_2=location                              #存放第2次出现‘=’的位置
  35.     if string[location_2]=='=':                      #循环跳过所有的‘=’符号之后,在开始存放数据
  36.          location_2+=1           
  37.     else:
  38.        variation(location_2,3)         
  39.                                       
  40. f.close()
  41. boy_1.close()
  42. boy_2.close()
  43. boy_3.close()
  44. girl_1.close()
  45. girl_2.close()
  46. girl_3.close()
复制代码

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

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

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

  7.     while True:
  8.         line=file.__next__()

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

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

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

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

  18.     except StopIteration:
  19.         pass

  20.     except BaseException as err:
  21.         print(err.__repr())
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-3-26 17:10:19 | 显示全部楼层
emmm
怎么个没结果法?搞死不出答案还是报错?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-26 17:25:21 | 显示全部楼层
文件的关闭应该放到循环里面
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

运行了一晚上,第二天报错了,显示这句有问题
if string[i]=='\n' and  "小客服:" in string[max(sign):i]:
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

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

  7.     while True:
  8.         line=file.__next__()

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

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

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

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

  18.     except StopIteration:
  19.         pass

  20.     except BaseException as err:
  21.         print(err.__repr())
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

  8. def variation(range_1,count):
  9.      i=0
  10.      sign=[0]  
  11.      while string[i] != '=':
  12.         for i in range(range_1,len(string)):
  13.             if string[i]=='\n' and  "小客服:" in string[max(sign):i]:
  14.                boy='boy_'+str(count)+'.txt'
  15.                boy_file=open(boy,'w+')               #+4的目的是避免将”小甲鱼:“,”小客服:“放入文件中               
  16.                boy_file.write(string[max(sign)+4:i]) #max(sign)找最大值,越往后的换行符的位置参数越大,就是离当前换行符最近的那一个换行符的位置
  17.                i+=1                                  #跳过第二个换行符,开始新一轮判别,原因如下
  18.                sign.append(i)                        #存放换行符的位置,换行符是有每个句子结尾和句子开头都有一个换行符,例如‘女朋友?\n\n小甲鱼:咦???\n\n小客服:我跟:’
  19.             else:                                       
  20.                if string[i]=='\n' and  "小甲鱼:" in string[max(sign):i] :
  21.                    girl='girl'+str(count)+'.txt'
  22.                    girl_file=open(girl,'w+')
  23.                    girl_file.write(string[max(sign)+4:i])
  24.                    i+=1
  25.                    sign.append(i)
  26.      print('location=',i)                            #输出当前出现‘=’的位置
  27.                                                                               
  28. variation(0,1)
  29. boy_1.close()
  30. girl_1.close()
  31. location_1=location                                  #存放第一次出现‘=’的位置
  32. if string[location_1]=='=':                          #循环跳过所有的‘=’符号之后,在开始存放数据
  33.    location_1+=1
  34. else:
  35.     variation(location_1,2)
  36.     boy_2.close()
  37.     girl_2.close()
  38.     location_2=location                              #存放第2次出现‘=’的位置
  39.     if string[location_2]=='=':                      #循环跳过所有的‘=’符号之后,在开始存放数据
  40.          location_2+=1           
  41.     else:
  42.        variation(location_2,3)         
  43.        boy_3.close()
  44.        girl_3.close()
  45.       
  46. f.close()






  47. #现在显示回溯(最后调用):
  48. #  File "C:\Users\Administrator\Desktop\python\29_fenduan.py", line 29, in <module>
  49. #   variation(0,1)
  50.   #File "C:\Users\Administrator\Desktop\python\29_fenduan.py", line 12, in variation
  51.    # while string[i] != '=':
  52. #IndexError: string index out of range
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-26 18:02:35 | 显示全部楼层
你的代码中必须遇到 = 才结束循环,这里没遇到,并且后面没有字符了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

所以在第三次运行的时候,会一直运行下去,停不下来
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

好的,谢谢,大概懂你的思路了,我的太繁琐了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

使用道具 举报

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

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

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

  42. #----------------------------情况三----------------------------------------------
  43.          
  44.        for i in range(location_2,len(string)):
  45.             if string[i]=='\n' and  "小客服:" in string[max(sign):i]:
  46.                boy='boy_'+str(count)+'.txt'
  47.                boy_file=open(boy,'w+')                           
  48.                boy_file.write(string[max(sign)+4:i])
  49.                i+=1                                 
  50.                sign.append(i)                        
  51.             else:                                       
  52.                if string[i]=='\n' and  "小甲鱼:" in string[max(sign):i] :
  53.                    girl='girl'+str(count)+'.txt'
  54.                    girl_file=open(girl,'w+')
  55.                    girl_file.write(string[max(sign)+4:i])
  56.                    i+=1
  57.                    sign.append(i)
  58.        boy_3.close()
  59.        girl_3.close()
  60.       
  61. f.close()
复制代码
的错误
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

我还是想知道我的啥地方有问题
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

嘛……其实我觉得你写代码之前应该先写一个框架,再完成代码,到时候自己写的哪有问题基本也能清楚
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

感谢你的建议,这样也方便别人看
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

因为string读进来的字符串是有长度的,你的循环里面i一直在增加,而没有合理的跳出,导致越界
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

我这程序问题真是多,我加了一个条件,改成
while string[i] != '=' and i <= len(string):
同样的地方还是有问题
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-11 17:29

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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