循环目录(Python 应用程序中的文件夹和子文件夹)

Loop Directory (folder and Subfolder in Python app)

我正在尝试让一个应用程序在目录(文件夹和子目录)中循环搜索多个扩展名或关键字,并在动态框架中输出列表,但代码(或 returns 如果没有找到则为零).

当前代码在输入多个扩展名(或关键字)时失败,或者通过将多个结果分组到框架的单行中而失败。

我在调试下面发布的代码时需要帮助。

谢谢

   from st_aggrid import AgGrid
    import streamlit as st
    import pandas as pd
    import os

    office= st.text_input("Enter your Office : ")
    path= st.text_input("Enter directory path to search : ")
    extensions= st.text_input("Enter the File Extension :")

    file_names = [fn for fn in os.listdir(path) if any(fn.endswith(ext) for ext in extensions)]
    df = pd.DataFrame({'Office' : [office],'Directory' : [path],'File_Name' : file_names})
    AgGrid(df, fit_columns_on_grid_load=True)

您的代码中存在一些问题:

  1. 当使用 st.text_input 获取扩展名时,返回的值是一个字符串而不是扩展名列表。为了解决这个问题,只需要求用户输入用逗号分隔的扩展名,然后拆分字符串以获得扩展名列表。

    extensions= st.text_input("Enter the File Extension (Seperated with comma):").split(",")
    
  2. 当您第一次 运行 Streamlit 代码时,officepathextensions 的值是 None,导致 FileNotFoundError 所以我们需要 运行 代码来循环遍历目录并仅当这些值不是 None.

    时才显示文件
     if office and path and extensions:
         # code
    
  3. 搜索文件不是递归的,所以我们需要更改它以获取子文件夹文件,我们也可以使用这个问题 How to do a recursive sub-folder search and return files in a list? 中建议的解决方案来做到这一点。我们还需要检查文件是否有扩展名或关键字。

综合起来:

import os
import streamlit as st
import pandas as pd
from st_aggrid import AgGrid

office= st.text_input("Enter your Office : ")
path= st.text_input("Enter directory path to search : ")
extensions= st.text_input("Enter the File Extension (Seperated with comma):").split(",")

if office and path and extensions:
  file_names = []
  file_names_ext = []
  dirs = []
  for dp, dn, filenames in os.walk(path):
    for fn in filenames:
      for ext in extensions:
        if ext in fn:
          dirs.append(dp)
          file_names.append(os.path.join(dp, fn))
          file_names_ext.append(ext)
          break

  df = pd.DataFrame({'Office': office , 'Directory': dirs, 'File_Name' : file_names, 'Term': file_names_ext})
  AgGrid(df, fit_columns_on_grid_load=True)

例如,如果我有以下文件夹结构:

这些是工作代码的输出示例: