编程与 AI12 分钟阅读更新于 2026-07-14

Python 怎么读取 CSV 文件并转成 JSON:适合数据清洗和接口调试

从真实工作场景出发,讲清 Python 读取 CSV、处理中文编码、清洗空值、转换字段类型、导出 JSON 的完整流程,适合数据整理、接口调试和运营表格处理。

相关工具

先说场景:为什么经常要把 CSV 转成 JSON

很多人第一次遇到 CSV 转 JSON,不是因为要学一个新语法,而是手头真的有一份表格要处理。比如运营同学导出了一份用户报名表,产品同学给了一个活动配置表,后端接口需要一批测试数据,或者你要把 Excel 里的内容整理成前端能直接读取的结构。这些数据常常是 CSV 格式,因为 CSV 简单、通用、能被 Excel、WPS、数据库和很多后台系统导出。

JSON 则更适合程序使用。接口请求体、配置文件、前端 mock 数据、自动化脚本、低代码平台导入数据,很多地方都喜欢 JSON。CSV 像表格,一行一条记录;JSON 像对象和数组,更容易表达字段名、层级和类型。把 CSV 转成 JSON,本质上就是把表格里的每一行变成一个对象,再把所有对象放进一个数组。

这件事看起来简单,但实际最容易出问题的地方并不是读取文件,而是编码、空值、数字类型、字段名和多余列。比如 CSV 是 GBK 编码,Python 默认按 UTF-8 读就会报错;表格里的价格看起来是数字,读出来却是字符串;某些单元格是空的,如果不处理,后续接口可能不接受。下面这篇会按真实处理流程讲,而不是只给一段短代码。

准备一份最小可用的 CSV 示例

先准备一个简单文件,比如 users.csv,内容如下:id,name,age,city;1,张三,28,杭州;2,李四,31,上海;3,王五,,北京。这个例子里有几个常见点:第一行是表头,后面每一行是一条数据;age 有一行为空;id 和 age 看起来是数字,但 CSV 本质上都是文本。

如果你从 Excel 另存为 CSV,要注意保存编码。现在大多数情况建议使用 UTF-8。如果你打开文件看到中文乱码,通常是编码不一致。Python 读取时可以显式指定 encoding='utf-8-sig',它能兼容带 BOM 的 UTF-8 文件。老系统导出的 CSV 可能是 GBK,这时可以改成 encoding='gbk' 试试。

在转换前,建议先用在线 CSV 工具或文本编辑器检查一下表头。字段名最好使用英文或清晰的拼音,比如 user_id、name、age,不建议用包含空格、括号和特殊符号的表头。字段名越稳定,转成 JSON 后越容易被程序使用。

用 Python 标准库读取 CSV

Python 自带 csv 模块,不需要安装第三方库。最常用的是 csv.DictReader,它会把第一行当成字段名,把后面的每一行读成字典。基础代码如下:

python代码示例
import csv
import json

rows = []
with open('users.csv', 'r', encoding='utf-8-sig', newline='') as f:
    reader = csv.DictReader(f)
    for row in reader:
        rows.append(row)

print(json.dumps(rows, ensure_ascii=False, indent=2))

这段代码会输出一个 JSON 数组,每一行 CSV 变成一个对象。ensure_ascii=False 的作用是让中文正常显示,而不是变成 unicode 转义。indent=2 是为了格式化输出,方便阅读。如果是给程序传输,也可以去掉 indent,得到更紧凑的 JSON。

这一步只是完成了最基础的转换。你会发现 id 和 age 仍然是字符串,空 age 也是空字符串。很多时候这没问题,但如果接口要求 age 是数字,或者空值应该是 null,就需要进一步清洗。

清洗字段类型和空值

真实项目里,CSV 转 JSON 很少直接一读就完事。你通常要把数字字段转成 int 或 float,把空字符串转成 None,把无用字段删掉,把字段名改成接口需要的名字。比如:

python代码示例
def to_int(value):
    value = value.strip()
    return int(value) if value else None

rows = []
with open('users.csv', 'r', encoding='utf-8-sig', newline='') as f:
    reader = csv.DictReader(f)
    for row in reader:
        item = {
            'id': to_int(row.get('id', '')),
            'name': row.get('name', '').strip(),
            'age': to_int(row.get('age', '')),
            'city': row.get('city', '').strip(),
        }
        rows.append(item)

这里用了 row.get,是为了避免某个字段不存在时直接报错。strip 可以去掉前后空格,尤其是从表格复制或导出时,隐藏空格很常见。to_int 函数把空值转成 None,最终 json.dumps 会把 None 输出为 null,这通常更符合 JSON 语义。

如果有金额、评分、比例,可以写 to_float。不要盲目把所有字段都转成数字,比如手机号、身份证号、订单号虽然看起来是数字,但应该保留字符串。否则前导 0 会丢失,大数字也可能产生精度问题。字段类型要根据业务含义判断。

把结果写入 JSON 文件

如果转换结果要给别人使用,最好写入一个 .json 文件,而不是只打印在终端里。代码如下:

python代码示例
with open('users.json', 'w', encoding='utf-8') as f:
    json.dump(rows, f, ensure_ascii=False, indent=2)

写入文件后,建议用 JSON 格式化工具打开检查一次。重点看三件事:中文是否正常;数组和对象结构是否正确;数字、字符串、null 是否符合预期。尤其是准备把 JSON 交给接口时,最好先复制到 JSON 工具里校验,确认没有多余逗号、编码异常或结构错误。

如果 JSON 文件很大,不一定要 indent=2。格式化会让文件更易读,但体积也更大。调试阶段建议格式化,正式传输或存储可以压缩。工具帮的 JSON 工具可以在格式化、压缩和校验之间来回切换,适合做最后检查。

常见坑和处理建议

第一是编码问题。中文乱码时,先尝试 utf-8-sig,再尝试 gbk。不要在代码里反复替换乱码字符,应该先找到正确编码。第二是分隔符问题。有些文件虽然叫 CSV,但实际用分号或制表符分隔。这时 DictReader 可以传 delimiter 参数,比如 delimiter='\t'。

第三是表头不干净。表头可能包含空格、中文括号或不可见字符,导致 row.get('name') 取不到值。可以先打印 reader.fieldnames 看看实际字段名。第四是空行和合计行。很多表格导出后末尾会带合计,转 JSON 前要过滤掉,否则接口测试数据会混入不该有的记录。

第五是嵌套结构。CSV 天然是二维表,如果你想转成复杂嵌套 JSON,比如每个用户下面有多个订单,不能只靠一行一对象完成。需要先按 user_id 分组,再组装 orders 数组。新手可以先处理简单结构,等字段和类型稳定后,再考虑嵌套。

常见问题

Python 读取 CSV 需要安装 pandas 吗?

不一定。简单 CSV 转 JSON 用标准库 csv 和 json 就够了。数据量大或需要复杂分析时再考虑 pandas。

CSV 里的数字为什么转成 JSON 后是字符串?

CSV 本质是文本格式,读取后默认都是字符串。需要根据字段含义手动转换 int、float 或 null。

中文乱码怎么办?

优先检查文件编码。常见选择是 utf-8-sig 和 gbk,不建议直接替换乱码字符。

Python 实用

继续阅读

返回专题