鱼C论坛

 找回密码
 立即注册
查看: 1333|回复: 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 编辑
import os

def find(filename , keyword):
    r = []
    f = open(filename)
    try:
        c = 1
        for x in f:
            i = x . find(keyword , 0)     
            while i != -1:
                r . append((c , i))
                i = x . find(keyword , i + 1)
            c += 1
    except Exception as e:
        print('*** 错误 ***')
        print('\t文件 : ["%s"]' % filename)
        print('\t' , e)          
    f . close()
    return r

def find_keyword(rdir , keyword):
    for root , dirs , files in os . walk(rdir):
        for file in files:
            filename = os . path . join(root , file)
            ext = os . path . splitext(filename)[1] . lower()
            if ext == '.exe':
                d = find(filename , keyword)
                if d:
                    print('文件["%s"] , 关键字["%s"] : ' % (filename , keyword))
                    for x in d:
                        print('\t第 [%4d] 行第 [%4d] 列' % (x[0] , x[1]))
            
target_file_list = input('请输入需要查找的目标文件夹 : ')
key_word = input('请输入需要查找的关键字 : ')
find_keyword(target_file_list,key_word)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-1-2 12:31:31 | 显示全部楼层
在if splited_name[1 == '.txt':这一句 少了半个中括号
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")
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-1-2 12:36:29 | 显示全部楼层
???
os.chdir有返回值的吗??
你这函数用法就不对
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

def find(filename , keyword):
    r = []
    f = open(filename)
    try:
        c = 1
        for x in f:
            i = x . find(keyword , 0)     
            while i != -1:
                r . append((c , i))
                i = x . find(keyword , i + 1)
            c += 1
    except Exception as e:
        print('*** 错误 ***')
        print('\t文件 : ["%s"]' % filename)
        print('\t' , e)          
    f . close()
    return r

def find_keyword(rdir , keyword):
    for root , dirs , files in os . walk(rdir):
        for file in files:
            filename = os . path . join(root , file)
            ext = os . path . splitext(filename)[1] . lower()
            if ext == '.exe':
                d = find(filename , keyword)
                if d:
                    print('文件["%s"] , 关键字["%s"] : ' % (filename , keyword))
                    for x in d:
                        print('\t第 [%4d] 行第 [%4d] 列' % (x[0] , x[1]))
            
target_file_list = input('请输入需要查找的目标文件夹 : ')
key_word = input('请输入需要查找的关键字 : ')
find_keyword(target_file_list,key_word)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

谢谢,还是不行的,我再去研究下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

谢谢大佬的指点,这个可以的,我等下再修改下代码,就当是学习啦
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-16 21:37

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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