鱼C论坛

 找回密码
 立即注册
查看: 1863|回复: 14

[已解决]这个bug出在哪里啊

[复制链接]
发表于 2020-7-6 09:07:25 | 显示全部楼层 |阅读模式

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

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

x
这个程序是根据用户输入路径查找文件夹内所有含有关键词的文件,并显示在文件内具体位置(第几行第几列)
import os
def find_word(line,word): #关键字在某一行的具体位置
    n = []
    m = line.find(word)
    while m != 1:
        n.append(m)
        m = line.find(word,m + 1)
    return n


def find_line(file,word): #定义记录关键字行数的函数
    n = 0
    f = open(file,'rt')
    m = {}
    for i in f:
        n += 1
        if word in i:
            q = find_word(i,word)
            m[n] = q
    f.close()
    return m


def file_find(paths,word):
    text_files = []
    all_files = os.walk(paths)
    for i in all_files:
        for r in i[2]:
            if os.path.splitext(r)[1] == '.txt':
                r = os.path.join(i[0],r)
                text_files.append(r)
    for each_text in text_files:
        m = file_find(each_text,word)
        if m:
            print_file(m)


def print_file(m): #定义输出函数
    keys = m.keys
    for each_keys in keys:
        print(f'关键字出现在{each_keys}行的第{m[keys]}个字符')


word = input('请输入关键字:')
paths = input('请输入查找初始路径:')
file_find(paths,word)


最开始报错了,但是后来不知道怎么回事不报错了,但是什么也不输出
最佳答案
2020-7-6 09:42:55
[b]

有三个错误

第一个错误: while 循环条件错误,应该是 m != -1 ,而你 m != 1 会导致死循环

第二个错误:file_find() 函数里的 for each_text 循环下面 m = file_find(each_text,word) 错了,应该改成 m = find_line(each_text,word)

第三个错误:最后一个函数 print_file(m) ,你 m[keys] 是错的,应该将 print_file(m) 函数改成这样:
import os
def find_word(line,word): #关键字在某一行的具体位置
    n = []
    m = line.find(word)
    while m != -1:
        n.append(m)
        m = line.find(word,m + 1)
    return n


def find_line(file,word): #定义记录关键字行数的函数
    n = 0
    f = open(file,'rt')
    m = {}
    for i in f:
        n += 1
        if word in i:
            q = find_word(i,word)
            m[n] = q
    f.close()
    return m


def file_find(paths,word):
    text_files = []
    all_files = os.walk(paths)

    for i in all_files:
        for r in i[2]:
            if os.path.splitext(r)[1] == '.txt':
                r = os.path.join(i[0],r)
                text_files.append(r)
    for each_text in text_files:
        m = find_line(each_text,word)
        if m:
            print('\n'+f'文件路径:{each_text}'.center(60,'-'))
            print_file(m)


def print_file(m): #定义输出函数
    for each_keys in m:
        print(f'关键字出现在{each_keys}行的第{m[each_keys]}个字符')


word = input('请输入关键字:')
paths = input('请输入查找初始路径:')
file_find(paths,word)


你的代码我帮加上打印文件路径了

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

使用道具 举报

发表于 2020-7-6 09:18:32 | 显示全部楼层
本帖最后由 heidern0612 于 2020-7-6 09:20 编辑

m = file_find(each_text,word)  

函数里面调用自身,并且你的函数还没返回值,这一行错了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-6 09:42:55 | 显示全部楼层    本楼为最佳答案   
[b]

有三个错误

第一个错误: while 循环条件错误,应该是 m != -1 ,而你 m != 1 会导致死循环

第二个错误:file_find() 函数里的 for each_text 循环下面 m = file_find(each_text,word) 错了,应该改成 m = find_line(each_text,word)

第三个错误:最后一个函数 print_file(m) ,你 m[keys] 是错的,应该将 print_file(m) 函数改成这样:
import os
def find_word(line,word): #关键字在某一行的具体位置
    n = []
    m = line.find(word)
    while m != -1:
        n.append(m)
        m = line.find(word,m + 1)
    return n


def find_line(file,word): #定义记录关键字行数的函数
    n = 0
    f = open(file,'rt')
    m = {}
    for i in f:
        n += 1
        if word in i:
            q = find_word(i,word)
            m[n] = q
    f.close()
    return m


def file_find(paths,word):
    text_files = []
    all_files = os.walk(paths)

    for i in all_files:
        for r in i[2]:
            if os.path.splitext(r)[1] == '.txt':
                r = os.path.join(i[0],r)
                text_files.append(r)
    for each_text in text_files:
        m = find_line(each_text,word)
        if m:
            print('\n'+f'文件路径:{each_text}'.center(60,'-'))
            print_file(m)


def print_file(m): #定义输出函数
    for each_keys in m:
        print(f'关键字出现在{each_keys}行的第{m[each_keys]}个字符')


word = input('请输入关键字:')
paths = input('请输入查找初始路径:')
file_find(paths,word)


你的代码我帮加上打印文件路径了

[/b]
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2020-7-6 18:43:48 | 显示全部楼层
import os
def find_word(line,word): #关键字在某一行的具体位置
    n = []
    m = line.find(word)
    while m != -1:
        n.append(m)
        m = line.find(word,m + 1)
    return n


def find_line(file,word): #定义记录关键字行数的函数
    n = 0
    f = open(file,'rt')
    m = {}
    for i in f:
        n += 1
        if word in i:
            q = find_word(i,word)
            m[n] = q
    f.close()
    return m


def file_find(paths,word):
    text_files = []
    all_files = os.walk(paths)

    for i in all_files:
        for r in i[2]:
            if os.path.splitext(r)[1] == '.txt':
                r = os.path.join(i[0],r)
                text_files.append(r)
    for each_text in text_files:
        m = find_line(each_text,word)
        if m:
            print('\n'+f'文件路径:{each_text}'.center(60,'-'))
            print_file(m)


def print_file(m): #定义输出函数
    for each_keys in m:
        print(f'关键字出现在{each_keys}行的第{m[each_keys]}个字符')


word = input('请输入关键字:')
paths = input('请输入查找初始路径:')
file_find(paths,word)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-7-6 22:20:45 | 显示全部楼层
Twilight6 发表于 2020-7-6 09:42
有三个错误:

第一个错误: while 循环条件错误,应该是 m != -1 ,而你 m != 1 会导致死循环

谢谢哈,我一会去改一下试试
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-6 22:22:50 | 显示全部楼层
魔_慌 发表于 2020-7-6 22:20
谢谢哈,我一会去改一下试试




OK~你自己改的话要认值点哈~

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

使用道具 举报

 楼主| 发表于 2020-7-6 22:26:14 | 显示全部楼层
本帖最后由 魔_慌 于 2020-7-6 22:28 编辑
Twilight6 发表于 2020-7-6 09:42
有三个错误:

第一个错误: while 循环条件错误,应该是 m != -1 ,而你 m != 1 会导致死循环


还是报错了啊
UnicodeDecodeError: 'gbk' codec can't decode byte 0xac in position 21: illegal multibyte sequence
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-6 22:33:11 | 显示全部楼层
魔_慌 发表于 2020-7-6 22:26
还是报错了啊
UnicodeDecodeError: 'gbk' codec can't decode byte 0xac in position 21: i ...

这个是你文件编码问题,不是代码问题,设置下编码即可

在open 那加上参数 encoding = 'utf-8'
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-7-6 22:41:02 | 显示全部楼层
Twilight6 发表于 2020-7-6 22:33
这个是你文件编码问题,不是代码问题,设置下编码即可

在open 那加上参数 encoding = 'utf-8'


UnicodeDecodeError: 'utf-8' codec can't decode byte 0xbb in position 7: invalid start byte
加上以后还是报错文件编码有问题是说我有文件出问题了吗
刚刚接触这东西,懂得太少了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-6 22:46:01 | 显示全部楼层
魔_慌 发表于 2020-7-6 22:41
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xbb in position 7: invalid start byte
加上 ...





重新新建个测试用的文件夹,然后按下面的流程保存 txt 文件即可:

第一步打开记事本,选择另存为:

                               
登录/注册后可看大图



第二步选择编码,进行保存,这里选 utf-8 那么 open 打开的时候就要带上 utf-8:

                               
登录/注册后可看大图



这里如果选择 ANSI ,那么就不要带 encoding 参数:

                               
登录/注册后可看大图



切记 这个文件夹里面编码要全部一致,否则就会像你刚刚那样,改了编码还是报错,就是因为遍历到的有些文件是 gbk  有的是 utf-8 导致的



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

使用道具 举报

 楼主| 发表于 2020-7-6 22:59:28 | 显示全部楼层
Twilight6 发表于 2020-7-6 22:46
重新新建个测试用的文件夹,然后按下面的流程保存 txt 文件即可:

第一步打开记事本,选择另 ...

不报错了,但是... ...他什么也没有输出,文件里有要查找的关键字啊,还有一个问题就是怎么知道我那个文件是UTF-8的,怎么改成ANSI
太晚了,我先睡了明天我再看吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-6 23:18:29 | 显示全部楼层
魔_慌 发表于 2020-7-6 22:59
不报错了,但是... ...他什么也没有输出,文件里有要查找的关键字啊,还有一个问题就是怎么知道我那个文 ...



你是不是运行过程有问题,看看我的运行效果:

11.png


还有一个问题就是怎么知道我那个文件是UTF-8的,怎么改成ANSI


如果想通过 Python ,那么需要第三方模块 chardet 来看文件编码

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

使用道具 举报

 楼主| 发表于 2020-7-7 07:06:29 | 显示全部楼层
Twilight6 发表于 2020-7-6 23:18
你是不是运行过程有问题,看看我的运行效果:

可以了,多谢,这块弄得太懵了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-7-7 07:07:26 | 显示全部楼层
魔_慌 发表于 2020-7-7 07:06
可以了,多谢,这块弄得太懵了



没事~慢慢来,不懂的继续发帖子问,加油~~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-7-7 08:05:33 | 显示全部楼层
Twilight6 发表于 2020-7-7 07:07
没事~慢慢来,不懂的继续发帖子问,加油~~

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-20 03:51

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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