循环目录(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)
您的代码中存在一些问题:
当使用 st.text_input
获取扩展名时,返回的值是一个字符串而不是扩展名列表。为了解决这个问题,只需要求用户输入用逗号分隔的扩展名,然后拆分字符串以获得扩展名列表。
extensions= st.text_input("Enter the File Extension (Seperated with comma):").split(",")
当您第一次 运行 Streamlit 代码时,office
、path
、extensions
的值是 None
,导致 FileNotFoundError
所以我们需要 运行 代码来循环遍历目录并仅当这些值不是 None.
时才显示文件
if office and path and extensions:
# code
搜索文件不是递归的,所以我们需要更改它以获取子文件夹文件,我们也可以使用这个问题 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)
例如,如果我有以下文件夹结构:
这些是工作代码的输出示例:
我正在尝试让一个应用程序在目录(文件夹和子目录)中循环搜索多个扩展名或关键字,并在动态框架中输出列表,但代码(或 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)
您的代码中存在一些问题:
当使用
st.text_input
获取扩展名时,返回的值是一个字符串而不是扩展名列表。为了解决这个问题,只需要求用户输入用逗号分隔的扩展名,然后拆分字符串以获得扩展名列表。extensions= st.text_input("Enter the File Extension (Seperated with comma):").split(",")
当您第一次 运行 Streamlit 代码时,
时才显示文件office
、path
、extensions
的值是None
,导致FileNotFoundError
所以我们需要 运行 代码来循环遍历目录并仅当这些值不是 None.if office and path and extensions: # code
搜索文件不是递归的,所以我们需要更改它以获取子文件夹文件,我们也可以使用这个问题 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)
例如,如果我有以下文件夹结构:
这些是工作代码的输出示例: