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

如何按特定条件将CSV转换为JSON,区分图片与网页Link字段?

解决CSV转JSON时按文件类型动态处理Link字段的问题

需求回顾

把CSV数据每行转换成以「姓名_编号.json」命名的独立JSON文件,其中link字段需要根据文件扩展名自动处理:

  • 若为图片格式(如jpg、png、jpeg等),格式化为{"link": {"photo": [{"abc": "文件名"}]}}
  • 若为html格式,格式化为{"link": {"webpage": [{"abc": "文件名"}]}}

原代码存在缩进错误、多余字段处理,且手动维护图片扩展名列表效率低,以下是优化后的解决方案:

优化后的代码

import json
import csv
import mimetypes

# 用with语句自动管理文件资源,避免手动关闭
with open("student_data.csv", 'r', encoding='utf-8') as csv_file:
    # 指定CSV表头,确保读取字段准确
    csv_reader = csv.DictReader(csv_file, fieldnames=["no", "name", "link"])
    # 跳过CSV的表头行
    next(csv_reader)
    
    for row in csv_reader:
        # 清洗字段值,去除前后空格避免判断出错
        link_value = row['link'].strip()
        name = row['name'].strip()
        no = row['no'].strip()
        
        # 自动识别文件类型,无需手动枚举所有图片扩展名
        mime_type, _ = mimetypes.guess_type(link_value)
        if mime_type and mime_type.startswith('image/'):
            row['link'] = {"photo": [{"abc": link_value}]}
        elif link_value.lower().endswith('.html'):
            row['link'] = {"webpage": [{"abc": link_value}]}
        
        # 生成JSON并写入目标文件
        json_content = json.dumps(row, indent=2, ensure_ascii=False)
        with open(f"{name}_{no}.json", 'w', encoding='utf-8') as json_output:
            json_output.write(json_content)

代码说明

  1. 自动识别图片类型:借助mimetypes模块通过扩展名推断MIME类型,只要是image/开头的类型都判定为图片,无需手动维护冗长的图片扩展名列表
  2. 安全管理文件资源:用with语句处理文件操作,自动完成资源释放,避免手动调用close()导致的资源泄漏
  3. 数据清洗:对CSV字段值执行strip(),去除前后空格,防止因CSV行尾空格导致的格式判断错误
  4. 修复原代码问题:移除了原代码中不存在的roll_number字段处理,修正了缩进错误,指定表头确保字段读取准确

示例验证

给定CSV数据:

no,name,link        
1,pal,image.png 
2,nina,page.html    
3,ashi,image.jpg    

运行代码后,pal_1.json的输出符合预期:

{
  "no": "1",
  "name": "pal",
  "link": {
    "photo": [
      {
        "abc": "image.png"
      }
    ]
  }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 01:40:25