魔_慌 发表于 2020-7-6 09:07:25

这个bug出在哪里啊

这个程序是根据用户输入路径查找文件夹内所有含有关键词的文件,并显示在文件内具体位置(第几行第几列)

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 = 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:
            if os.path.splitext(r) == '.txt':
                r = os.path.join(i,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}个字符')


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


最开始报错了,但是后来不知道怎么回事不报错了,但是什么也不输出

heidern0612 发表于 2020-7-6 09:18:32

本帖最后由 heidern0612 于 2020-7-6 09:20 编辑

m = file_find(each_text,word)

函数里面调用自身,并且你的函数还没返回值,这一行错了。

Twilight6 发表于 2020-7-6 09:42:55



有三个错误:

第一个错误: 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 是错的,应该将 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 = 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:
            if os.path.splitext(r) == '.txt':
                r = os.path.join(i,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}个字符')


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

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

乘号 发表于 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 = 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:
            if os.path.splitext(r) == '.txt':
                r = os.path.join(i,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}个字符')


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

魔_慌 发表于 2020-7-6 22:20:45

Twilight6 发表于 2020-7-6 09:42
有三个错误:

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


谢谢哈,我一会去改一下试试

Twilight6 发表于 2020-7-6 22:22:50

魔_慌 发表于 2020-7-6 22:20
谢谢哈,我一会去改一下试试



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

魔_慌 发表于 2020-7-6 22:26:14

本帖最后由 魔_慌 于 2020-7-6 22:28 编辑

Twilight6 发表于 2020-7-6 09:42
有三个错误:

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


还是报错了啊{:10_266:}
UnicodeDecodeError: 'gbk' codec can't decode byte 0xac in position 21: illegal multibyte sequence

Twilight6 发表于 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'

魔_慌 发表于 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
加上以后还是报错{:10_266:}文件编码有问题是说我有文件出问题了吗
刚刚接触这东西,懂得太少了{:10_266:}

Twilight6 发表于 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 文件即可:

第一步打开记事本,选择另存为:
https://xxx.ilovefishc.com/forum/202005/25/072650zqq1fqqmng421bqz.jpg

第二步选择编码,进行保存,这里选 utf-8 那么 open 打开的时候就要带上 utf-8:
https://xxx.ilovefishc.com/forum/202005/25/072647nvzjv2zemvgxet5g.jpg

这里如果选择 ANSI ,那么就不要带 encoding 参数:
https://xxx.ilovefishc.com/forum/202006/22/222937li4vv400i6v44b6z.png


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



魔_慌 发表于 2020-7-6 22:59:28

Twilight6 发表于 2020-7-6 22:46
重新新建个测试用的文件夹,然后按下面的流程保存 txt 文件即可:

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

不报错了,但是... ...他什么也没有输出,文件里有要查找的关键字啊,还有一个问题就是怎么知道我那个文件是UTF-8的,怎么改成ANSI{:10_266:}
太晚了,我先睡了{:10_266:}明天我再看吧{:10_282:}

Twilight6 发表于 2020-7-6 23:18:29

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



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




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

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

魔_慌 发表于 2020-7-7 07:06:29

Twilight6 发表于 2020-7-6 23:18
你是不是运行过程有问题,看看我的运行效果:




可以了,多谢,这块弄得太懵了{:10_266:}

Twilight6 发表于 2020-7-7 07:07:26

魔_慌 发表于 2020-7-7 07:06
可以了,多谢,这块弄得太懵了



没事~慢慢来,不懂的继续发帖子问,加油~~

魔_慌 发表于 2020-7-7 08:05:33

Twilight6 发表于 2020-7-7 07:07
没事~慢慢来,不懂的继续发帖子问,加油~~

谢谢{:5_109:}
页: [1]
查看完整版本: 这个bug出在哪里啊