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

如何读取目录下含JSON内容的TXT文件并按label字段重命名?

批量读取目录并按JSON字段重命名文件

嘿,这个问题我刚好处理过!首先得区分你是在浏览器环境还是用Node.js脚本,因为两种场景的实现方式差很多——你之前写的XMLHttpRequest是浏览器端的API,但浏览器出于安全考虑,根本没法直接读取本地目录,所以得换思路。下面分两种情况给你详细方案:

情况1:Node.js本地脚本(推荐,适合批量处理本地文件)

这是处理本地目录文件最方便的方式,Node.js可以直接访问文件系统,完全满足批量重命名的需求。

实现步骤:

  • 引入Node.js内置的fs(文件系统)和path(路径处理)模块
  • 读取目标目录下的所有文件
  • 逐个读取文件内容,解析成JSON对象
  • 提取label字段作为新文件名,执行重命名操作

完整代码示例:

const fs = require('fs').promises;
const path = require('path');

// 替换成你的目标目录路径,比如 './txt-files'
const targetDir = './your-txt-directory';

async function renameFilesByLabel() {
  try {
    // 获取目录下的所有文件列表
    const files = await fs.readdir(targetDir);
    
    for (const file of files) {
      // 只处理后缀为.txt的文件
      if (path.extname(file).toLowerCase() === '.txt') {
        const fullFilePath = path.join(targetDir, file);
        
        // 读取文件内容(utf-8编码)
        const fileContent = await fs.readFile(fullFilePath, 'utf8');
        
        try {
          // 解析JSON内容
          const jsonData = JSON.parse(fileContent);
          
          if (jsonData.label) {
            // 构造新文件名,保留txt后缀
            const newFileName = `${jsonData.label}.txt`;
            const newFullPath = path.join(targetDir, newFileName);
            
            // 执行重命名(注意:如果已有同名文件会被覆盖,可根据需求加重名判断)
            await fs.rename(fullFilePath, newFullPath);
            console.log(`✅ 已重命名:${file} → ${newFileName}`);
          } else {
            console.log(`⚠️ 跳过文件${file}:未找到label字段`);
          }
        } catch (parseError) {
          console.log(`❌ 跳过文件${file}:JSON解析失败`, parseError);
        }
      }
    }
  } catch (error) {
    console.error('❌ 处理过程出错:', error);
  }
}

// 启动处理函数
renameFilesByLabel();

使用提示:

  1. 把targetDir替换成你的实际目录路径
  2. 确保已经安装Node.js,然后在终端运行node 你的脚本文件名.js
  3. 怕重名覆盖的话,可以加个判断:比如检查新文件名是否已存在,若存在就加序号后缀(如label_1.txt)

情况2:浏览器端实现(需用户手动选择文件)

浏览器出于安全限制,不能直接读写本地文件目录,所以只能让用户通过文件选择器批量选文件,然后生成重命名后的文件供下载:

代码示例:

<!-- 文件选择器,支持多选txt文件 -->
<input type="file" id="txtFileInput" multiple accept=".txt">
<button onclick="startProcessing()">开始处理并下载</button>

<script>
async function startProcessing() {
  const fileInput = document.getElementById('txtFileInput');
  const selectedFiles = fileInput.files;
  
  if (selectedFiles.length === 0) {
    alert('请先选择至少一个TXT文件哦');
    return;
  }
  
  for (const file of selectedFiles) {
    try {
      // 读取文件内容
      const content = await file.text();
      // 解析JSON
      const jsonData = JSON.parse(content);
      
      if (jsonData.label) {
        // 创建Blob对象用于下载
        const blob = new Blob([content], { type: 'text/plain' });
        const downloadUrl = URL.createObjectURL(blob);
        
        // 创建下载链接并触发点击
        const downloadLink = document.createElement('a');
        downloadLink.href = downloadUrl;
        downloadLink.download = `${jsonData.label}.txt`;
        downloadLink.click();
        
        // 释放URL对象
        URL.revokeObjectURL(downloadUrl);
        console.log(`✅ 已生成下载文件:${jsonData.label}.txt`);
      } else {
        console.log(`⚠️ 跳过文件${file.name}:未找到label字段`);
      }
    } catch (error) {
      console.log(`❌ 跳过文件${file.name}:文件内容不是有效JSON`, error);
    }
  }
}
</script>

说明:

  • 这个方案没法直接修改本地文件,只能生成新文件让用户下载,适合少量文件处理
  • 如果你需要批量处理大量文件,还是优先用Node.js的方案

另外提一句:你之前写的同步XMLHttpRequest代码,现在更推荐用异步的fetch或者FileReader,避免阻塞浏览器页面~

内容的提问来源于stack exchange,提问作者Hannah

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 07:17:19