如何提取公司文件夹及对应合同文件名至Pandas DataFrame
问题分析与解决方案
原代码的核心问题是错误关联了文件和所属文件夹:os.walk返回的file是当前path目录下的文件,而你却把这些文件和当前目录的子文件夹subdir做了绑定,这就导致文件和所属文件夹完全不对应,还会把根目录下的无关文件(比如Untitled.ipynb)错误关联到子文件夹上。
另外,代码没有限定只处理Contracts目录,会遍历到当前工作目录下的所有子目录(包括.ipynb_checkpoints这类临时目录),这也是结果出现无关内容的原因。
方案一:修正os.walk的使用逻辑
我们需要遍历Contracts目录,当进入到公司子文件夹时,提取该文件夹的名称,然后将该文件夹下的所有文件与这个名称对应:
import os import pandas as pd # 指定Contracts目录的路径,避免依赖当前工作目录 contracts_dir = "./Contracts" folder_names = [] contract_files = [] for root, dirs, files in os.walk(contracts_dir): # 只处理公司子文件夹(即Contracts的直接子目录) if os.path.dirname(root) == contracts_dir: # 获取当前公司文件夹的名称 folder_name = os.path.basename(root) # 遍历该文件夹下的所有文件 for file in files: folder_names.append(folder_name) contract_files.append(file) df = pd.DataFrame({ 'Folder_Name': folder_names, 'Contract': contract_files })
如果需要遍历所有层级的子文件夹(比如公司子文件夹下还有子目录),可以去掉层级判断,直接提取当前目录的最后一级名称:
import os import pandas as pd contracts_dir = "./Contracts" folder_names = [] contract_files = [] for root, dirs, files in os.walk(contracts_dir): # 跳过Contracts根目录本身 if root == contracts_dir: continue # 获取当前目录的名称(最后一级) folder_name = os.path.basename(root) for file in files: folder_names.append(folder_name) contract_files.append(file) df = pd.DataFrame({ 'Folder_Name': folder_names, 'Contract': contract_files })
方案二:使用pathlib(更简洁直观)
pathlib是Python 3.4+推荐的文件路径处理库,代码可读性更强:
from pathlib import Path import pandas as pd contracts_dir = Path("./Contracts") # 遍历Contracts下的所有文件(包括子目录里的) contract_files = [f for f in contracts_dir.rglob("*") if f.is_file()] # 提取文件所在的直接父目录名称和文件名 data = [ (f.parent.name, f.name) for f in contract_files ] df = pd.DataFrame(data, columns=['Folder_Name', 'Contract'])
如果只需要Contracts直接子文件夹中的文件,把rglob("*")换成glob("*/*")即可:
from pathlib import Path import pandas as pd contracts_dir = Path("./Contracts") # 只获取Contracts直接子文件夹下的文件 contract_files = [f for f in contracts_dir.glob("*/*") if f.is_file()] data = [ (f.parent.name, f.name) for f in contract_files ] df = pd.DataFrame(data, columns=['Folder_Name', 'Contract'])
内容的提问来源于stack exchange,提问作者I_Got_A_Name
相关产品推荐
相关产品推荐

