秦镜lla 发表于 2020-8-29 00:04:42

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


import os


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


def find_each_line_key(each_line,dict_key,line):
    '''查找段落中的key'''
    line_key = each_line.find(key)
    position = []
    while line_key != -1:
      position.append(line_key+1)
      line_key = each_line.find(key,line_key)
    return position


def find_key(files):
    '''打开文件并查找'''
    txt = open(files)
    line = 0
    dict_key = dict()
    for each_line in txt:
      line+=1
      position = find_each_line_key(each_line,dict_key,line)
      dict_key = position
    txt.close()
    return dict_key




def open_file(list_txt,a,name,i):
      '''打开文件'''
      for files in list_txt:
            dict_key = find_key(files)
            #查找步骤
            #打印结果
            print('在文件【%s】中找到关键字【%s】'%(i,name))
            print_answer(dict_key)
            print('===============================================================')
            
   
def find_file(key):
    '''查找txt文件'''
    list_txt = []
   
    a = os.walk(os.getcwd())
    for i in a:
      for name in i:
            more = os.path.splitext(name)
            if more == '.txt':
                list_txt.append((i+'\\'+name))
                open_file(list_txt,a,name,i)



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




这是题目原文:



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



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

西伯利亚狼。, 发表于 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 = 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 = position

西伯利亚狼。, 发表于 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 处开始。

秦镜lla 发表于 2020-8-29 16:25:13

西伯利亚狼。, 发表于 2020-8-29 08:31
你这个程序还有个问题。
问题:
      for each_line in txt:


已修改,但是修改后的程序会将所有txt文件返回,如何将增加的if判断语句同时运用在下面的print中?

秦镜lla 发表于 2020-8-29 16:27:45

西伯利亚狼。, 发表于 2020-8-29 08:31
你这个程序还有个问题。
问题:
      for each_line in txt:


而且还会重复返回

西伯利亚狼。, 发表于 2020-8-29 16:42:51

我复制了你的程序,修改了两处问题,跑了一下并没有出现重复返回。应该是你后面又对你的程序做了改动,你试试用你帖子里的程序,然后修改这两处问题。

西伯利亚狼。, 发表于 2020-8-29 16:43:43

你应该把输出语句放在循环语句外面。

秦镜lla 发表于 2020-8-29 17:04:38

本帖最后由 秦镜lla 于 2020-8-29 17:07 编辑

西伯利亚狼。, 发表于 2020-8-29 16:43
你应该把输出语句放在循环语句外面。这是修改后的代码,我将输出语句放在判断语句的条件下确报错了:
import os


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


def find_each_line_key(each_line,dict_key,line):
    '''查找段落中的key'''
    line_key = each_line.find(key)
    position = []
    while line_key != -1:
      position.append(line_key+1)
      line_key = each_line.find(key,line_key+1)
    return position


def find_key(files,a,name,i):
    '''打开文件并查找'''
    txt = open(files)
    line = 0
    dict_key = dict()
    for each_line in txt:
      line+=1
      if key in each_line:
            position = find_each_line_key(each_line,dict_key,line)
            dict_key = position
            choice = 1
      else:
            break
    if choice ==1:
      print('在文件【%s】中找到关键字【%s】'%(i,name))
      print_answer(dict_key)
      print('===============================================================')
    txt.close()
    return dict_key




def open_file(list_txt,a,name,i):
      '''打开文件'''
      for files in list_txt:
            dict_key = find_key(files,a,name,i)
            #查找步骤
            #打印结果
            
            
   
def find_file(key):
    '''查找txt文件'''
    list_txt = []
   
    a = os.walk(os.getcwd())
    for i in a:
      for name in i:
            more = os.path.splitext(name)
            if more == '.txt':
                list_txt.append((i+'\\'+name))
                open_file(list_txt,a,name,i)



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




西伯利亚狼。, 发表于 2020-8-29 18:28:17

choice 这个参数错了,如果choice上的if语句没有执行,那么choice这个参数就不会赋值,而且这个参数没有必要。你第一个程序写得挺好的,第二个程序你添加了一些不必要的句子,所以你安照第一个程序来修改,修改后再重新写一遍,这样你的记忆会加深。

秦镜lla 发表于 2020-8-29 18:39:09

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

好的,谢谢
页: [1]
查看完整版本: python 第30讲中动动手最后一个我的代码实现有点问题,求大佬帮忙解决