|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
代码思路我都写在注释里了,为什么跑不出来啊,请各位帮忙看看吧!谢谢大家
主要思路就是:一个文件有关键字,这个文件创一个列表each_txt,列表里放字典line_site,字典的键是行数line_num,值是列数site_num(字符位置)且值site_num也是一个列表(因为有多个位置)
- import os
- paths = [] # 存放有关键字的文件的路径
- each_txt = [] # 存放每个文件中每个关键字{行:列}字典的列表
- def search_keyword(keyword) :
- all_files = os.listdir(os.curdir)
-
- for each_file in all_files:
- ext = os.path.splitext(each_file)[1]
-
- if os.path.isdir(each_file) :
- os.chdir(each_file)
- search_keyword(keyword)
- os.chdir(os.pardir)
-
- if ext == '.txt':
- path = os.getcwd() + os.sep + each_file # path保存文本文件路径
- f = open(each_file)
- line_site = dict() # 存放每个关键字{行:列}的字典,每个新文件都要置空
- line_num = 0
-
- for each_line in f:
- site_num = [] # 存放【列】的列表,每一行查找时都要置空
- line_num += 1 # 每行的行数每次 +1
-
- while 1:
- i = 0
- site = each_line.find(keyword, i) # 查找关键字,如果有返回关键字的第一个索引号(即列),没有返回-1
- if site != -1: # 查到关键字
- site_num.append(site) # 将关键字的第一个索引号即列值加入列表中
- i = site + 1 # 从site后一个位置查找这一行还有没有关键字(11在1111中的数目
- else: # 如果没有找到关键字
- break # 说明each_line这一行检索完毕或根本没有关键字,退出while循环查找下一行
-
- if site_num == []: # 如果【列】的列表是空的,说明这一行没有关键字
- continue # 继续查找下一行
- else: # 如果【列】的列表不是空的,说明这一行有关键字
- line_site[line_num] = site_num # 在字典中添加{行数(数字):列数【列表】}
- each_txt.append(line_site) # 在这个文件的列表中添加字典
-
- if line_site == {}: # 如果字典是空的,说明没有{行:列}添加,即此文件中没有关键字
- continue # 退出查找每行的for循环,查找下一文件
- else: # 如果字典不是空的,说明有{行:列}添加,即此文件中有关键字
- paths.append(path) # 添加此文件的路径
-
- f.close()
-
- keyword = input('请将该脚本放于待查找的文件夹内,请输入关键字:')
- search_keyword(keyword)
- decide = input('请问是否需要打印关键字【%s】在文件中大的具体位置(YES/NO):' % keyword)
- if decide in ['YES', 'yes', 'Yes']:
-
- if paths == []: # 为空说明没有存在关键字的文件
- print('===================================================')
- print('当前文件夹内所有文本文件均不含有此关键字!')
- else:
- print('===================================================')
-
- for each_path in paths: # paths有一个元素就说明有一个文件有关键字
- print('在文件【%s】中找到关键字【%s】' % (each_path, keyword))
-
- for each_line_site in each_txt: # each_txt是一个列表(每个文件一个列表),每个元素each_line_site都为字典
-
- for each_item in each_line_site.items(): # each_item是字典的每一项,是一个元组(键(行),值(列))
- print('关键字出现在第 %d 行,第' % each_item(0), each_item(1), '个位置。') # 值(列)是一个列表
复制代码
本帖最后由 txxcat 于 2020-4-24 01:58 编辑
你的代码还有几处错误,看注释:
- import os
- paths = [] # 存放有关键字的文件的路径
- each_txt = [] # 存放每个文件中每个关键字{行:列}字典的列表
- def copen(filename):
- try:
- f = open(filename,encoding='GBK')
- try:
- f.read()
- f.seek(0)
- except UnicodeDecodeError:
- f = open(filename,encoding='utf-8',errors='ignore')
- except (OSError,AttributeError) as reason:
- print(str(reason))
- return None
- return f
- def search_keyword(keyword) :
- all_files = os.listdir(os.curdir)
-
- for each_file in all_files:
- ext = os.path.splitext(each_file)[1]
-
- if os.path.isdir(each_file) :
- os.chdir(each_file)
- search_keyword(keyword)
- os.chdir(os.pardir)
-
- if ext == '.txt':
- path = os.getcwd() + os.sep + each_file
- f = copen(each_file) #用函数copen打开防止编码错误
- line_site = dict()
- line_num = 0
-
- for each_line in f:
- site_num = []
- line_num += 1
-
- i = 0
- while 1:
- site = each_line.find(keyword, i)
- if site != -1:
- site_num.append(site+1) #python索引从0开始,人类习惯1开始
- i = site + 1
- else:
- break
-
- if site_num == []:
- continue
- else:
- line_site[line_num] = site_num
- # each_txt.append(line_site) #在这里append,每找到一行就append一次,重复数据导致错误
-
- if line_site == {}:
- continue
- else:
- paths.append(path)
- each_txt.append(line_site) #在这里append就不会有重复数据
- f.close()
- keyword = input('请将该脚本放于待查找的文件夹内,请输入关键字:')
- search_keyword(keyword)
- decide = input('请问是否需要打印关键字【%s】在文件中大的具体位置(YES/NO):' % keyword)
- if decide.strip().lower()=='yes': #这样可以对付任意大小写组合,还有空格
-
- if paths == []:
- print('===================================================')
- print('当前文件夹内所有文本文件均不含有此关键字!')
- else:
- print('===================================================')
- for i in range(len(paths)): #原有的代码是有多少符合条件的文件,就把所有的答案重复打印多少次
- print('在文件【%s】中找到关键字【%s】' % (paths[i], keyword)) #只打印和文件对应的字典
- for j,k in each_txt[i].items():
- print('关键字出现在第 %d 行,第%s个位置。' % (j, k))
-
- # for each_path in paths: # paths有一个元素就说明有一个文件有关键字
- # print('在文件【%s】中找到关键字【%s】' % (each_path, keyword))
- #
- # for each_line_site in each_txt: # each_txt是一个列表(每个文件一个列表),每个元素each_line_site都为字典
- #
- # for each_item in each_line_site.items(): # each_item是字典的每一项,是一个元组(键(行),值(列))
- # print('关键字出现在第 %d 行,第' % each_item[0], each_item[1], '个位置。') # 值(列)是一个列表
复制代码
|
|