鱼C论坛

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

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

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


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


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[line] = 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[0],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[2]: 
            more = os.path.splitext(name)[1]
            if more == '.txt':
                list_txt.append((i[0]+'\\'+name))
                open_file(list_txt,a,name,i)



key = input('请将该脚本放于待查找的文件夹内,请输入关键字:')
check = input('请问是否需要打印关键字【%s】在文件中的具体位置(YES/NO):' % key)
check.lower()
if check == 'yes':
    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 ...
想知道小甲鱼最近在做啥?请访问 -> 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
想知道小甲鱼最近在做啥?请访问 -> 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 处开始。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

已修改,但是修改后的程序会将所有txt文件返回,如何将增加的if判断语句同时运用在下面的print中?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

捕获.PNG 而且还会重复返回
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

使用道具 举报

发表于 2020-8-29 16:43:43 | 显示全部楼层
你应该把输出语句放在循环语句外面。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 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[each]))


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[line] = position
            choice = 1
        else:
            break
    if choice ==1:
        print('在文件【%s】中找到关键字【%s】'%(i[0],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[2]: 
            more = os.path.splitext(name)[1]
            if more == '.txt':
                list_txt.append((i[0]+'\\'+name))
                open_file(list_txt,a,name,i)



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

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

使用道具 举报

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

好的,谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-11 06:30

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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