鱼C论坛

 找回密码
 立即注册
查看: 1816|回复: 5

[已解决]python文件查找当前文件夹内文本文档内关键字无法运行

[复制链接]
发表于 2021-1-2 12:26:18 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 苏东坡大居士 于 2021-1-2 12:30 编辑

import os

#改变工作目录
path = os.chdir("E:\\python\\小甲鱼\\python代码")

#遍历path路径以下所有的子目录,返回一个三元组:(路径, [包含目录], [包含文件])
container = os.walk(path)

def find_txt(path):
    #存放文本文件文件名
    txt_name_container = []

    #此时each_path的格式为(路径,[包含目录],[包含文件])
    for each_path in container:

        #此时each_file_name遍历each_name的文件
        for each_file_name in each_path[2]:

            #splitext(path)        分离文件名与扩展名,返回(f_name, f_extension)元组
            splited_name = os.path.splitext(each_file_name)

            if splited_name[1] == '.txt':
                 #file_path=each_path[0]+'\\'+each_file_name#得到文本文件路径
                 file_path = os.path.join(each_path[0],each_file_name)

                 #将文本文件路径存入列表
                 txt_name_container.append(file_path)

    return txt_name_container

def find_keyword(target_file_list,key_word,c):
    positions = []
    flag = 0

    #遍历target_file_list
    for each_file_name in target_file_list:
        row = 0

        #以只读文件方式打开文件
        txt_file = open(each_file_name,'r',encoding='UTF-8')

        #遍历打开的txt_file文件的每一行
        for each_line in txt_file:

            #当我们输入目标语句在each——line中时,打印该文件
            if key_word in each_line:

                print("========================")

                #在含有目标文件的txt行中打印出第多少行时目标文件语段
                print('在文件【%s】中找到关键字【%s】'%(each_file_name,key_word))

                flag = 1
               
                #关闭文件
                txt_file.close()
                break
        
        if flag == 0:
            print("没有在该文件夹中找到关键字!")
            break

        elif flag == 1 and c in['YES','yes','Y','y','Yes']:
            #打开each_file_name
            txt_file = open(each_file_name)

            #遍历打开txt_file文件的每一行
            for each_line in txt_file:

                #计算each_line的行的数量
                end = len(each_line)


                row += 1
#Python3 range() 函数返回的是一个可迭代对象(类型是对象), 所以打印的时候不会打印列表。
#Python3 list() 函数是对象迭代器,可把range()返回的可迭代对象转为一个列表,返回的变量类型为列表。
                for start in range(end):
                    p = (each_line.find(key_word,start,end)+1)

                    #print(p)
                    if p != 0 and p not in positions:
                        psoitions.append(p)
                if positions:

                    print('关键字出现在第%d行的%d个位置'%(row,psoitions))

                psoitions = []

            txt_file.close()

target_file_list = input('请输入需要查找的目标文件夹:')
key_word = input("请输入需要查找的关键字:")
if __name__ == "_qd_main__":
    find_keyword(target_file_list,key_word,"yes")
最佳答案
2021-1-2 14:05:31
本帖最后由 jackz007 于 2021-1-2 14:07 编辑
  1. import os

  2. def find(filename , keyword):
  3.     r = []
  4.     f = open(filename)
  5.     try:
  6.         c = 1
  7.         for x in f:
  8.             i = x . find(keyword , 0)     
  9.             while i != -1:
  10.                 r . append((c , i))
  11.                 i = x . find(keyword , i + 1)
  12.             c += 1
  13.     except Exception as e:
  14.         print('*** 错误 ***')
  15.         print('\t文件 : ["%s"]' % filename)
  16.         print('\t' , e)         
  17.     f . close()
  18.     return r

  19. def find_keyword(rdir , keyword):
  20.     for root , dirs , files in os . walk(rdir):
  21.         for file in files:
  22.             filename = os . path . join(root , file)
  23.             ext = os . path . splitext(filename)[1] . lower()
  24.             if ext == '.exe':
  25.                 d = find(filename , keyword)
  26.                 if d:
  27.                     print('文件["%s"] , 关键字["%s"] : ' % (filename , keyword))
  28.                     for x in d:
  29.                         print('\t第 [%4d] 行第 [%4d] 列' % (x[0] , x[1]))
  30.             
  31. target_file_list = input('请输入需要查找的目标文件夹 : ')
  32. key_word = input('请输入需要查找的关键字 : ')
  33. find_keyword(target_file_list,key_word)
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-1-2 12:31:31 | 显示全部楼层
在if splited_name[1 == '.txt':这一句 少了半个中括号

  1. import os

  2. #改变工作目录
  3. path = os.chdir("E:\\python\\小甲鱼\\python代码")

  4. #遍历path路径以下所有的子目录,返回一个三元组:(路径, [包含目录], [包含文件])
  5. container = os.walk(path)

  6. def find_txt(path):
  7.     #存放文本文件文件名
  8.     txt_name_container = []

  9.     #此时each_path的格式为(路径,[包含目录],[包含文件])
  10.     for each_path in container:

  11.         #此时each_file_name遍历each_name的文件
  12.         for each_file_name in each_path[2]:

  13.             #splitext(path) 分离文件名与扩展名,返回(f_name, f_extension)元组
  14.             splited_name = os.path.splitext(each_file_name)

  15.             if splited_name[1] == '.txt':
  16.                  #file_path=each_path[0]+'\\'+each_file_name#得到文本文件路径
  17.                  file_path = os.path.join(each_path[0],each_file_name)

  18.                  #将文本文件路径存入列表
  19.                  txt_name_container.append(file_path)

  20.     return txt_name_container

  21. def find_keyword(target_file_list,key_word,c):
  22.     positions = []
  23.     flag = 0

  24.     #遍历target_file_list
  25.     for each_file_name in target_file_list:
  26.         row = 0

  27.         #以只读文件方式打开文件
  28.         txt_file = open(each_file_name,'r',encoding='UTF-8')

  29.         #遍历打开的txt_file文件的每一行
  30.         for each_line in txt_file:

  31.             #当我们输入目标语句在each——line中时,打印该文件
  32.             if key_word in each_line:

  33.                 print("========================")

  34.                 #在含有目标文件的txt行中打印出第多少行时目标文件语段
  35.                 print('在文件【%s】中找到关键字【%s】'%(each_file_name,key_word))

  36.                 flag = 1
  37.                
  38.                 #关闭文件
  39.                 txt_file.close()
  40.                 break
  41.         
  42.         if flag == 0:
  43.             print("没有在该文件夹中找到关键字!")
  44.             break

  45.         elif flag == 1 and c in['YES','yes','Y','y','Yes']:
  46.             #打开each_file_name
  47.             txt_file = open(each_file_name)

  48.             #遍历打开txt_file文件的每一行
  49.             for each_line in txt_file:

  50.                 #计算each_line的行的数量
  51.                 end = len(each_line)


  52.                 row += 1
  53. #Python3 range() 函数返回的是一个可迭代对象(类型是对象), 所以打印的时候不会打印列表。
  54. #Python3 list() 函数是对象迭代器,可把range()返回的可迭代对象转为一个列表,返回的变量类型为列表。
  55.                 for start in range(end):
  56.                     p = (each_line.find(key_word,start,end)+1)

  57.                     #print(p)
  58.                     if p != 0 and p not in positions:
  59.                         psoitions.append(p)
  60.                 if positions:

  61.                     print('关键字出现在第%d行的%d个位置'%(row,psoitions))

  62.                 psoitions = []

  63.             txt_file.close()

  64. target_file_list = input('请输入需要查找的目标文件夹:')
  65. key_word = input("请输入需要查找的关键字:")
  66. if __name__ == "_qd_main__":
  67.     find_keyword(target_file_list,key_word,"yes")
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-1-2 12:36:29 | 显示全部楼层
???
os.chdir有返回值的吗??
你这函数用法就不对
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-1-2 14:05:31 | 显示全部楼层    本楼为最佳答案   
本帖最后由 jackz007 于 2021-1-2 14:07 编辑
  1. import os

  2. def find(filename , keyword):
  3.     r = []
  4.     f = open(filename)
  5.     try:
  6.         c = 1
  7.         for x in f:
  8.             i = x . find(keyword , 0)     
  9.             while i != -1:
  10.                 r . append((c , i))
  11.                 i = x . find(keyword , i + 1)
  12.             c += 1
  13.     except Exception as e:
  14.         print('*** 错误 ***')
  15.         print('\t文件 : ["%s"]' % filename)
  16.         print('\t' , e)         
  17.     f . close()
  18.     return r

  19. def find_keyword(rdir , keyword):
  20.     for root , dirs , files in os . walk(rdir):
  21.         for file in files:
  22.             filename = os . path . join(root , file)
  23.             ext = os . path . splitext(filename)[1] . lower()
  24.             if ext == '.exe':
  25.                 d = find(filename , keyword)
  26.                 if d:
  27.                     print('文件["%s"] , 关键字["%s"] : ' % (filename , keyword))
  28.                     for x in d:
  29.                         print('\t第 [%4d] 行第 [%4d] 列' % (x[0] , x[1]))
  30.             
  31. target_file_list = input('请输入需要查找的目标文件夹 : ')
  32. key_word = input('请输入需要查找的关键字 : ')
  33. find_keyword(target_file_list,key_word)
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-1-2 19:06:21 | 显示全部楼层
qq1151985918 发表于 2021-1-2 12:31
在if splited_name[1 == '.txt':这一句 少了半个中括号

谢谢,还是不行的,我再去研究下
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-1-2 19:07:00 | 显示全部楼层
qiuyouzhi 发表于 2021-1-2 12:36
???
os.chdir有返回值的吗??
你这函数用法就不对

谢谢大佬的指点,这个可以的,我等下再修改下代码,就当是学习啦
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-29 14:23

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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