鱼C论坛

 找回密码
 立即注册
查看: 2988|回复: 9

[已解决]python 第30讲中动动手最后一个我的代码实现有点问题,求大佬帮忙解决

[复制链接]
发表于 2020-8-29 00:04:42 | 显示全部楼层 |阅读模式
10鱼币

  1. import os


  2. def print_answer(dict_key):
  3.     '''打印查找结果'''
  4.     keys = dict_key.keys()
  5.     keys = sorted(keys)
  6.     for each in keys:
  7.         print('关键字出现在第%s行,第%s个位置'%(each,dict_key[each]))


  8. def find_each_line_key(each_line,dict_key,line):
  9.     '''查找段落中的key'''
  10.     line_key = each_line.find(key)
  11.     position = []
  12.     while line_key != -1:
  13.         position.append(line_key+1)
  14.         line_key = each_line.find(key,line_key)
  15.     return position


  16. def find_key(files):
  17.     '''打开文件并查找'''
  18.     txt = open(files)
  19.     line = 0
  20.     dict_key = dict()
  21.     for each_line in txt:
  22.         line+=1
  23.         position = find_each_line_key(each_line,dict_key,line)
  24.         dict_key[line] = position
  25.     txt.close()  
  26.     return dict_key




  27. def open_file(list_txt,a,name,i):
  28.         '''打开文件'''
  29.         for files in list_txt:
  30.             dict_key = find_key(files)
  31.             #查找步骤
  32.             #打印结果
  33.             print('在文件【%s】中找到关键字【%s】'%(i[0],name))
  34.             print_answer(dict_key)
  35.             print('===============================================================')
  36.             
  37.    
  38. def find_file(key):
  39.     '''查找txt文件'''
  40.     list_txt = []
  41.    
  42.     a = os.walk(os.getcwd())
  43.     for i in a:
  44.         for name in i[2]:
  45.             more = os.path.splitext(name)[1]
  46.             if more == '.txt':
  47.                 list_txt.append((i[0]+'\\'+name))
  48.                 open_file(list_txt,a,name,i)



  49. key = input('请将该脚本放于待查找的文件夹内,请输入关键字:')
  50. check = input('请问是否需要打印关键字【%s】在文件中的具体位置(YES/NO):' % key)
  51. check.lower()
  52. if check == 'yes':
  53.     find_file(key)

复制代码



这是题目原文: 捕获.PNG



我的代码执行后提示错误显示内存溢出 捕获.PNG



但是实在不会怎么解决。。。困扰了我整整一天,跪求大佬解答

最佳答案
2020-8-29 00:04:43
你这个程序还有个问题。
问题:
        for each_line in txt:
        line+=1
        position = find_each_line_key(each_line,dict_key,line)  #并没有判断 key 是否在 each_line 中
        dict_key[line] = position
修改:for each_line in txt:
        line+=1
        if key in each_line:  # 增加一个判断语句,判断 key 是否在 each_line 中
            position = find_each_line_key(each_line,dict_key,line)
            dict_key[line] = position

最佳答案

查看完整内容

你这个程序还有个问题。 问题: for each_line in txt: line+=1 position = find_each_line_key(each_line,dict_key,line) #并没有判断 key 是否在 each_line 中 dict_key[line] = position 修改:for each_line in txt: line+=1 if key in each_line: # 增加一个判断语句,判断 key 是否在 each_line 中 position = find_each_line_key(each_line,dict ...
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-8-29 00:04:43 | 显示全部楼层    本楼为最佳答案   
你这个程序还有个问题。
问题:
        for each_line in txt:
        line+=1
        position = find_each_line_key(each_line,dict_key,line)  #并没有判断 key 是否在 each_line 中
        dict_key[line] = position
修改:for each_line in txt:
        line+=1
        if key in each_line:  # 增加一个判断语句,判断 key 是否在 each_line 中
            position = find_each_line_key(each_line,dict_key,line)
            dict_key[line] = position
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-8-29 08:08:47 | 显示全部楼层
第二个函数出问题了。
问题是: line_key = each_line.find(key,line_key)
修改后: line_key = each_line.find(key,line_key+1)  #第二次查找应该从 line_key + 1 处开始。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-8-29 16:25:13 | 显示全部楼层
西伯利亚狼。, 发表于 2020-8-29 08:31
你这个程序还有个问题。
问题:
        for each_line in txt:

已修改,但是修改后的程序会将所有txt文件返回,如何将增加的if判断语句同时运用在下面的print中?
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-8-29 16:27:45 | 显示全部楼层
西伯利亚狼。, 发表于 2020-8-29 08:31
你这个程序还有个问题。
问题:
        for each_line in txt:

捕获.PNG 而且还会重复返回
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-8-29 16:42:51 | 显示全部楼层
我复制了你的程序,修改了两处问题,跑了一下并没有出现重复返回。应该是你后面又对你的程序做了改动,你试试用你帖子里的程序,然后修改这两处问题。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-8-29 16:43:43 | 显示全部楼层
你应该把输出语句放在循环语句外面。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-8-29 17:04:38 | 显示全部楼层
本帖最后由 秦镜lla 于 2020-8-29 17:07 编辑
西伯利亚狼。, 发表于 2020-8-29 16:43
你应该把输出语句放在循环语句外面。
这是修改后的代码,我将输出语句放在判断语句的条件下确报错了:
  1. import os


  2. def print_answer(dict_key):
  3.     '''打印查找结果'''
  4.     keys = dict_key.keys()
  5.     keys = sorted(keys)
  6.     for each in keys:
  7.         print('关键字出现在第%s行,第%s个位置'%(each,dict_key[each]))


  8. def find_each_line_key(each_line,dict_key,line):
  9.     '''查找段落中的key'''
  10.     line_key = each_line.find(key)
  11.     position = []
  12.     while line_key != -1:
  13.         position.append(line_key+1)
  14.         line_key = each_line.find(key,line_key+1)
  15.     return position


  16. def find_key(files,a,name,i):
  17.     '''打开文件并查找'''
  18.     txt = open(files)
  19.     line = 0
  20.     dict_key = dict()
  21.     for each_line in txt:
  22.         line+=1
  23.         if key in each_line:
  24.             position = find_each_line_key(each_line,dict_key,line)
  25.             dict_key[line] = position
  26.             choice = 1
  27.         else:
  28.             break
  29.     if choice ==1:
  30.         print('在文件【%s】中找到关键字【%s】'%(i[0],name))
  31.         print_answer(dict_key)
  32.         print('===============================================================')
  33.     txt.close()  
  34.     return dict_key




  35. def open_file(list_txt,a,name,i):
  36.         '''打开文件'''
  37.         for files in list_txt:
  38.             dict_key = find_key(files,a,name,i)
  39.             #查找步骤
  40.             #打印结果
  41.             
  42.             
  43.    
  44. def find_file(key):
  45.     '''查找txt文件'''
  46.     list_txt = []
  47.    
  48.     a = os.walk(os.getcwd())
  49.     for i in a:
  50.         for name in i[2]:
  51.             more = os.path.splitext(name)[1]
  52.             if more == '.txt':
  53.                 list_txt.append((i[0]+'\\'+name))
  54.                 open_file(list_txt,a,name,i)



  55. key = input('请将该脚本放于待查找的文件夹内,请输入关键字:')
  56. check = input('请问是否需要打印关键字【%s】在文件中的具体位置(YES/NO):' % key)
  57. check.lower()
  58. if check == 'yes':
  59.     find_file(key)

复制代码

捕获.PNG

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

使用道具 举报

发表于 2020-8-29 18:28:17 | 显示全部楼层
choice 这个参数错了,如果choice上的if语句没有执行,那么choice这个参数就不会赋值,而且这个参数没有必要。你第一个程序写得挺好的,第二个程序你添加了一些不必要的句子,所以你安照第一个程序来修改,修改后再重新写一遍,这样你的记忆会加深。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-8-29 18:39:09 | 显示全部楼层
西伯利亚狼。, 发表于 2020-8-29 18:28
choice 这个参数错了,如果choice上的if语句没有执行,那么choice这个参数就不会赋值,而且这个参数没有必 ...

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-28 04:46

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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