输出不同路径下的所有文件名,放到map中

本文介绍了一个Java程序示例,该程序使用递归方法遍历指定目录及其子目录下的所有文件,并将每个文件的父目录作为键,将对应的所有文件路径作为值存储在Map中。最终以JSON格式输出收集到的数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

map中
key 父路径
value 该路径下所有的文件

package com.sitech.ddoe.om.db.relational.test;

import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;

public class Test {

    public static void main(String[] args) throws JsonProcessingException {

        Map map = new HashMap<>();
        findFiles(map, "C:\\Users\\Administrator\\Desktop\\obj-conf-data");
        System.out.println(new ObjectMapper().writeValueAsString(map));

    }

    public static void findFiles(Map map, String path) {

        File file = new File(path);
        File[] childFiles = file.listFiles();// 找出所有子目录
        List fileList = new ArrayList<>();

        for (int i = 0; childFiles != null && i < childFiles.length; i++) {

            if (childFiles[i].isDirectory()) {// 如果是目录的话,则调用自身
                findFiles(map, childFiles[i].getPath());
            } else {
                fileList.add(childFiles[i].getAbsolutePath());
                String parPath = childFiles[i].getParent();
                map.put(parPath, fileList);
            }
        }

    }

}

最终的效果:

{
    "C:\Users\Administrator\Desktop\obj-conf-data\crm\com\sitech\ddoe\client\api\objopt\sample": [
        "C:\Users\Administrator\Desktop\obj-conf-data\crm\com\sitech\ddoe\client\api\objopt\sample\Student.xml",
        "C:\Users\Administrator\Desktop\obj-conf-data\crm\com\sitech\ddoe\client\api\objopt\sample\User.xml"
    ],
    "C:\Users\Administrator\Desktop\obj-conf-data\gg": [
        "C:\Users\Administrator\Desktop\obj-conf-data\gg\ddd.txt",
        "C:\Users\Administrator\Desktop\obj-conf-data\gg\hh.txt"
    ],
    "C:\Users\Administrator\Desktop\obj-conf-data\order\com\sitech\ddoe\client\api\objopt\sample": [
        "C:\Users\Administrator\Desktop\obj-conf-data\order\com\sitech\ddoe\client\api\objopt\sample\Student.xml",
        "C:\Users\Administrator\Desktop\obj-conf-data\order\com\sitech\ddoe\client\api\objopt\sample\User.xml"
    ]
}
<think>好的,我现在需要回答用户的问题:“是所有的标签数据放到一个文件夹里就可以读取了吗”。用户之前的问题是关于如何改进处理ENVI生成的多个单独类别TIFF文件的代码,现在他在确认是否只需将所有标签文件放入同一个文件夹即可被正确读取。 首先,我需要回顾之前的对话。用户最初的代码需求是合并多个类别的TIFF标签文件,并确保空间对齐。我提供的改进方案中有一个`load_labels`函数,通过`glob.glob`遍历指定目录下符合命名规则的文件。因此,用户现在可能想知道是否只需将文件放入指定目录即可,是否需要其他条件。 接下来,我需要确认用户的问题核心。用户可能在操作时将所有标签文件放在同一文件夹下,但不确定代码是否能自动识别和处理它们。需要明确回答是否仅需放入文件夹,还是需要满足其他条件,如文件名格式、数据内容等。 根据之前的回答,代码中的`load_labels`函数使用`glob.glob(f"{class_dir}class_*.tif")`来查找所有以`class_`开头且后缀为`.tif`的文件。因此,文件名必须符合特定格式,例如`class_1.tif`、`class_6.tif`等,其中数字对应类别编码。用户可能未注意到这一点,导致疑问。 另外,需要强调文件名的规范性,确保类别编号正确,并且每个TIFF文件是单波段的二值掩膜。此外,空间对齐和坐标系的验证也是关键,否则即使文件在文件夹中,也可能因尺寸或投影不匹配而报错。 用户可能还关心冲突处理机制,即如果有多个标签文件覆盖同一区域时的处理方式。在之前的代码中,后读取的文件会覆盖之前的标签,这可能需要在回答中提醒用户注意标签文件的顺序或确保无重叠。 总结用户的疑问点:是否只需将标签文件放入同一文件夹即可,而无需其他操作。答案是否定的,因为需要满足文件名格式、数据内容、空间对齐等条件。需要详细说明这些前提条件,确保用户正确使用代码。 可能的误区是用户可能认为只要文件在文件夹内就能被读取,但实际上代码依赖于特定的命名规则和数据结构。需要明确指出这些要求,避免用户操作错误导致程序无法运行或结果不正确。 此外,用户可能希望得到进一步的指导,例如如何检查文件名是否正确,如何验证空间对齐等。因此,回答中应包括这些步骤,帮助用户进行验证和调试。 最后,确保回答结构清晰,分点列出前提条件,并给出验证方法,帮助用户逐步确认他们的标签文件是否符合要求,从而正确使用代码。</think>--- ### **核心回答** **是的,只要满足以下条件,将所有标签文件放入同一个文件夹即可自动读取:** --- ### **必要条件清单** | 条件项 | 具体要求 | 验证方法 | |--------|----------|----------| | **1. 文件名格式** | 必须符合`class_<国家编码>.tif`格式 | 示例:`class_6.tif`对应工矿仓储 | | **2. 文件内容** | 单波段二值掩膜 (0/1) | 在ENVI中查看波段数和像素值范围 | | **3. 空间对齐** | 与主影像分辨率、投影、范围完全一致 | 运行代码中的`空间对齐验证`代码块 | | **4. 目录结构** | 标签文件集中存放于指定目录 | 检查`class_dir`参数路径是否正确 | --- ### **操作指南** #### **步骤1:文件命名规范** - **正确示例** ```bash train_labels/ ├── class_1.tif # 耕地 ├── class_6.tif # 工矿仓储 └── class_11.tif # 水域及水利设施 ``` - **错误示例** ```bash train_labels/ ├── 耕地.tif # 未使用编号 └── class_water.tif # 非数字后缀 ``` #### **步骤2:内容格式验证** 在Python中快速检查单个文件: ```python with rasterio.open(&#39;train_labels/class_6.tif&#39;) as src: print("波段数:", src.count) # 应输出 1 print("像素值:", np.unique(src.read(1))) # 应只含 [0, 1] ``` #### **步骤3:执行自动合并** 调用函数时指定正确路径: ```python # 假设原始影像尺寸为(3000, 4000) labels = load_labels( img_shape=(3000, 4000), class_dir=&#39;path/to/your_labels/&#39; # 修改为实际路径 ) ``` --- ### **常见问题排查** | 问题现象 | 可能原因 | 解决方案 | |---------|---------|----------| | `KeyError` | 文件名中的编号未在`CLASS_MAP`中定义 | 检查文件名编号是否为国家标准编码 | | `ValueError`尺寸不匹配 | 标签文件与主影像分辨率不一致 | 在ENVI导出时选择`Match to Base Image` | | 合并后标签全为0 | 文件路径错误或命名不规范 | 用`glob.glob()`打印实际匹配到的文件列表 | --- ### **高级技巧** **动态类别映射**(适用于编码不固定的场景): ```python # 自动识别文件夹中存在的所有类别 existing_classes = [int(f.split(&#39;_&#39;)[-1].split(&#39;.&#39;)[0]) for f in glob.glob("labels/class_*.tif")] CLASS_MAP = {k: "自定义类别" for k in existing_classes} # 临时映射 ``` 通过上述规范操作,即可实现一键式多标签合并。建议首次运行时添加以下调试代码: ```python print("检测到的标签文件:", glob.glob(f"{class_dir}class_*.tif")) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值