You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何提取公司文件夹及对应合同文件名至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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 02:05:22