如何从子文件夹中检索文件名

How to retrieve file names from subfolders

我有以下文件夹结构:

root
│   file001.docx
│   file002.docx    
│
└───folder1
   │   file003.docx
   │   file004.docx
   │
   └───subfolder1
       │   file005.docx
       │   file006.docx
       |____subfolder2
            |
            |_file007.docx
   

我想创建一个程序,当有人输入他们的根目录和关键字时,该文件就会显示出来。例如:如果我输入“hello there!”,file007.docx 将出现(假设文本“hello there!”包含在 file007.docx 中)并让用户知道输入的单词在单词中医生

为了解决这个问题,我使用以下代码列出了文件夹和子文件夹中的所有 word 文档:

def find_doc():
    variable= input('What is your directory?') #asking for root directory
    os.chdir(variable)
    files = []
    for dirpath, dirnames, filenames in os.walk(variable):
        for filename in [f for f in filenames if f.endswith(".docx")]:
            files.append(filename)  
    return files

现在,这是在每个word文档中查找内容的第二个代码:

all_files= find_doc() # just calling the first function I just made

while True: 
    keyword= input('Input your word or type in Terminate to exit: ')
    for i in range(len(all_files)): 
        text = docx2txt.process(all_files[i]) 
        if keyword.lower() in text.lower():  #to make it case insensitive
            print ((all_files[i]))    
    if keyword== ('Terminate') or keyword== ('terminate'):
        break

理论上,如果我在输入中输入“hello”这个词:input('Input your word or type in Terminate to exit: '),我应该能够检索到 file007.docx 因为 all_files= find_doc() 输出

['file001.docx',
'file002.docx',
'file003.docx',
'file004.docx',
'file005.docx',
'file006.docx',
'file007.docx',]

由于 os.walk() 的递归性质。

但是,它给我一个错误:FileNotFoundError: [Errno 2] No such file or directory:

我在想我哪里做错了?谢谢!

我想你想将你的函数修改成类似这样的东西来存储文件名及其相关路径。

def find_doc():
    variable= input('What is your directory?') #asking for root directory
    os.chdir(variable)
    files = []
    for dirpath, dirnames, filenames in os.walk(variable):
        for filename in [f for f in filenames if f.endswith(".docx")]:
            files.append(os.path.join(dirpath, filename))
    return files

您还应该更改 while 循环,以便在 运行 for 循环之前检查您的 if 语句。

while True: 
    keyword= input('Input your word or type in Terminate to exit: ')
    if keyword.lower() == 'terminate':
        break
    else:   
        for i in range(len(all_files)): 
            text = docx2txt.process(all_files[i]) 
            if keyword.lower() in text.lower():  #to make it case insensitive
                print ((all_files[i]))