鱼C论坛

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

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

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

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

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

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

  1. import os
  2. def find_word(line,word): #关键字在某一行的具体位置
  3.     n = []
  4.     m = line.find(word)
  5.     while m != 1:
  6.         n.append(m)
  7.         m = line.find(word,m + 1)
  8.     return n


  9. def find_line(file,word): #定义记录关键字行数的函数
  10.     n = 0
  11.     f = open(file,'rt')
  12.     m = {}
  13.     for i in f:
  14.         n += 1
  15.         if word in i:
  16.             q = find_word(i,word)
  17.             m[n] = q
  18.     f.close()
  19.     return m


  20. def file_find(paths,word):
  21.     text_files = []
  22.     all_files = os.walk(paths)
  23.     for i in all_files:
  24.         for r in i[2]:
  25.             if os.path.splitext(r)[1] == '.txt':
  26.                 r = os.path.join(i[0],r)
  27.                 text_files.append(r)
  28.     for each_text in text_files:
  29.         m = file_find(each_text,word)
  30.         if m:
  31.             print_file(m)


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


  36. word = input('请输入关键字:')
  37. paths = input('请输入查找初始路径:')
  38. file_find(paths,word)
复制代码



最开始报错了,但是后来不知道怎么回事不报错了,但是什么也不输出
最佳答案
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[keys] 是错的,应该将 print_file(m) 函数改成这样:
  1. import os
  2. def find_word(line,word): #关键字在某一行的具体位置
  3.     n = []
  4.     m = line.find(word)
  5.     while m != -1:
  6.         n.append(m)
  7.         m = line.find(word,m + 1)
  8.     return n


  9. def find_line(file,word): #定义记录关键字行数的函数
  10.     n = 0
  11.     f = open(file,'rt')
  12.     m = {}
  13.     for i in f:
  14.         n += 1
  15.         if word in i:
  16.             q = find_word(i,word)
  17.             m[n] = q
  18.     f.close()
  19.     return m


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

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


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


  36. word = input('请输入关键字:')
  37. paths = input('请输入查找初始路径:')
  38. file_find(paths,word)
复制代码


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

想知道小甲鱼最近在做啥?请访问 -> 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 | 显示全部楼层    本楼为最佳答案   


有三个错误

第一个错误: 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) 函数改成这样:
  1. import os
  2. def find_word(line,word): #关键字在某一行的具体位置
  3.     n = []
  4.     m = line.find(word)
  5.     while m != -1:
  6.         n.append(m)
  7.         m = line.find(word,m + 1)
  8.     return n


  9. def find_line(file,word): #定义记录关键字行数的函数
  10.     n = 0
  11.     f = open(file,'rt')
  12.     m = {}
  13.     for i in f:
  14.         n += 1
  15.         if word in i:
  16.             q = find_word(i,word)
  17.             m[n] = q
  18.     f.close()
  19.     return m


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

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


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


  36. word = input('请输入关键字:')
  37. paths = input('请输入查找初始路径:')
  38. file_find(paths,word)
复制代码


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

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

使用道具 举报

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


  9. def find_line(file,word): #定义记录关键字行数的函数
  10.     n = 0
  11.     f = open(file,'rt')
  12.     m = {}
  13.     for i in f:
  14.         n += 1
  15.         if word in i:
  16.             q = find_word(i,word)
  17.             m[n] = q
  18.     f.close()
  19.     return m


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

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


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


  36. word = input('请输入关键字:')
  37. paths = input('请输入查找初始路径:')
  38. 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, 2024-4-26 21:33

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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