鱼C论坛

 找回密码
 立即注册
查看: 1184|回复: 1

[已解决]课后作业三十讲 第四题

[复制链接]
发表于 2022-2-6 19:05:32 | 显示全部楼层 |阅读模式

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

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

x
def search(dir1,name):
    import os
    os.chdir(dir1)
    for each_file in os.listdir(os.curdir):
        if os.path.isfile(each_file):
            type1=os.path.splitext(each_file)[1]
            if type1=='.txt':
                f=open(each_file,'r',encoding='utf-8')
                n=0
                if name in f:
                    print('文件【'+os.getcwd()+os.sep+each_file+'】中找到关键字【%s】'%(name))
                    for i in f:
                        n+=1
                        if name in i:
                            count=[]
                            str1=i
                            while name in str1:
                                a=str1.find(name)
                                str1=str1[(a+len(name)):]
                                count.append(a)
                            print('关键字出现在第%d行,第',count,'个位置'%(n))
                f.close()
        if os.path.isdir(each_file):
            search(each_file,name)
            os.chdir(os.pardir)
dir1=input('请输入待查找的初始目录:')
name=input('请输入关键字:')
search(dir1,name)

这是我自己打的 自己是个小白看不出来哪错了 求助大佬
   
   
最佳答案
2022-2-6 19:05:33

第一个错误是直接拿 字符串 与 文件对象进行比较:

if name in f:


可以将文件对象先进行读取,读取后在用 seek 函数将文件指针移动回 0

第二个错误是格式化字符串错误了:

print('关键字出现在第%d行,第',count,'个位置'%(n))


这里应该改成:

print('关键字出现在第%d行,第' % n, count, '个位置')


还有个错误,虽然不影响代码执行,但是会导致你的结果不正确:

while name in str1:
    a = str1.find(name)
    str1 = str1[(a + len(name)):]
    count.append(a)


若在同一行有多个相同的字符,那么会导致第二次开始的索引值是在新字符串 str1[(a + len(name)):] 进行判断距离的

所以这里 a 要加上上次的索引值 + 1,即将代码改成:

length = 0
while name in str1:
    a = str1.find(name)
    str1 = str1[(a + len(name)):]
    count.append(length + a)
    length += a + 1


另外导入模块尽量别写在函数内,写在文件前几行位置

参考代码:
import os


def search(dir1, name):
    os.chdir(dir1)
    for each_file in os.listdir(os.curdir):
        if os.path.isfile(each_file):
            type1 = os.path.splitext(each_file)[1]
            if type1 == '.txt':
                f = open(each_file, 'r', encoding='utf-8')
                n = 0
                text = f.read()
                if name in text:
                    print('文件【' + os.getcwd() + os.sep + each_file + '】中找到关键字【%s】' % (name))
                    f.seek(0)
                    for i in f:
                        n += 1
                        if name in i:
                            count = []
                            str1 = i
                            length = 0
                            while name in str1:
                                a = str1.find(name)
                                str1 = str1[(a + len(name)):]
                                count.append(length + a)
                                length += a + 1
                            print('关键字出现在第%d行,第' % n, count, '个位置')
                f.close()
        if os.path.isdir(each_file):
            search(each_file, name)
            os.chdir(os.pardir)


dir1 = input('请输入待查找的初始目录:')
name = input('请输入关键字:')
search(dir1, name)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-2-6 19:05:33 | 显示全部楼层    本楼为最佳答案   

第一个错误是直接拿 字符串 与 文件对象进行比较:

if name in f:


可以将文件对象先进行读取,读取后在用 seek 函数将文件指针移动回 0

第二个错误是格式化字符串错误了:

print('关键字出现在第%d行,第',count,'个位置'%(n))


这里应该改成:

print('关键字出现在第%d行,第' % n, count, '个位置')


还有个错误,虽然不影响代码执行,但是会导致你的结果不正确:

while name in str1:
    a = str1.find(name)
    str1 = str1[(a + len(name)):]
    count.append(a)


若在同一行有多个相同的字符,那么会导致第二次开始的索引值是在新字符串 str1[(a + len(name)):] 进行判断距离的

所以这里 a 要加上上次的索引值 + 1,即将代码改成:

length = 0
while name in str1:
    a = str1.find(name)
    str1 = str1[(a + len(name)):]
    count.append(length + a)
    length += a + 1


另外导入模块尽量别写在函数内,写在文件前几行位置

参考代码:
import os


def search(dir1, name):
    os.chdir(dir1)
    for each_file in os.listdir(os.curdir):
        if os.path.isfile(each_file):
            type1 = os.path.splitext(each_file)[1]
            if type1 == '.txt':
                f = open(each_file, 'r', encoding='utf-8')
                n = 0
                text = f.read()
                if name in text:
                    print('文件【' + os.getcwd() + os.sep + each_file + '】中找到关键字【%s】' % (name))
                    f.seek(0)
                    for i in f:
                        n += 1
                        if name in i:
                            count = []
                            str1 = i
                            length = 0
                            while name in str1:
                                a = str1.find(name)
                                str1 = str1[(a + len(name)):]
                                count.append(length + a)
                                length += a + 1
                            print('关键字出现在第%d行,第' % n, count, '个位置')
                f.close()
        if os.path.isdir(each_file):
            search(each_file, name)
            os.chdir(os.pardir)


dir1 = input('请输入待查找的初始目录:')
name = input('请输入关键字:')
search(dir1, name)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-12 13:16

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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