这个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:20 编辑
m = file_find(each_text,word)
函数里面调用自身,并且你的函数还没返回值,这一行错了。
有三个错误:
第一个错误: 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)
你的代码我帮加上打印文件路径了
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) Twilight6 发表于 2020-7-6 09:42
有三个错误:
第一个错误: while 循环条件错误,应该是 m != -1 ,而你 m != 1 会导致死循环
谢谢哈,我一会去改一下试试 魔_慌 发表于 2020-7-6 22:20
谢谢哈,我一会去改一下试试
OK~你自己改的话要认值点哈~
本帖最后由 魔_慌 于 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 魔_慌 发表于 2020-7-6 22:26
还是报错了啊
UnicodeDecodeError: 'gbk' codec can't decode byte 0xac in position 21: i ...
这个是你文件编码问题,不是代码问题,设置下编码即可
在open 那加上参数 encoding = 'utf-8' 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:} 魔_慌 发表于 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 导致的
Twilight6 发表于 2020-7-6 22:46
重新新建个测试用的文件夹,然后按下面的流程保存 txt 文件即可:
第一步打开记事本,选择另 ...
不报错了,但是... ...他什么也没有输出,文件里有要查找的关键字啊,还有一个问题就是怎么知道我那个文件是UTF-8的,怎么改成ANSI{:10_266:}
太晚了,我先睡了{:10_266:}明天我再看吧{:10_282:} 魔_慌 发表于 2020-7-6 22:59
不报错了,但是... ...他什么也没有输出,文件里有要查找的关键字啊,还有一个问题就是怎么知道我那个文 ...
你是不是运行过程有问题,看看我的运行效果:
还有一个问题就是怎么知道我那个文件是UTF-8的,怎么改成ANSI
如果想通过 Python ,那么需要第三方模块 chardet 来看文件编码
Twilight6 发表于 2020-7-6 23:18
你是不是运行过程有问题,看看我的运行效果:
可以了,多谢,这块弄得太懵了{:10_266:} 魔_慌 发表于 2020-7-7 07:06
可以了,多谢,这块弄得太懵了
没事~慢慢来,不懂的继续发帖子问,加油~~ Twilight6 发表于 2020-7-7 07:07
没事~慢慢来,不懂的继续发帖子问,加油~~
谢谢{:5_109:}
页:
[1]