Python CSV 转 JSON 完全指南
直接在浏览器中使用免费的 CSV转JSON,无需安装。
在线试用 CSV转JSON →CSV 文件无处不在——导出的报表、数据库备份、日志提取——早晚都需要在 Python 中将 CSV 转换为 JSON。 标准库通过两个模块处理这一任务: csv.DictReader 将每一行转换为 Python 字典, json.dumps() 将这些字典序列化为 JSON 字符串。如需无需代码的快速一次性转换,CSV to JSON 转换器可在浏览器中即时完成。 本指南涵盖完整的编程路径: json.dump() 与 json.dumps() 的区别、将 JSON 写入文件、dataclass 序列化、CSV 值的类型强制转换、 处理 datetime 和 Decimal,以及 orjson 等高性能替代方案。所有示例针对 Python 3.10+。
- ✓csv.DictReader 生成字典列表——使用 json.dump(rows, f, indent=2) 将完整列表写入 JSON 文件。
- ✓json.dump() 直接写入文件对象。json.dumps() 返回字符串。选对函数可避免不必要的内存拷贝。
- ✓CSV 的值始终是字符串。在序列化为 JSON 之前,需显式转换数值列(int()、float())。
- ✓向 json.dumps() 传入 ensure_ascii=False 可在输出中保留 Unicode 字符——带重音的名称、CJK 文本等。
- ✓对于 CSV 中的 datetime、UUID 或 Decimal,使用带自定义回退函数的 default= 参数。
order_id,product,quantity,price ORD-7291,Wireless Keyboard,2,49.99 ORD-7292,USB-C Hub,1,34.50
[
{
"order_id": "ORD-7291",
"product": "Wireless Keyboard",
"quantity": "2",
"price": "49.99"
},
{
"order_id": "ORD-7292",
"product": "USB-C Hub",
"quantity": "1",
"price": "34.50"
}
]"2"、 "49.99")。 CSV 没有类型系统——每个值都是字符串。 类型强制转换的处理方法将在下文的类型转换章节中介绍。json.dumps() — 将 Python 字典序列化为 JSON 字符串
json 模块随每个 Python 安装自带——无需 pip install。 json.dumps(obj) 接受一个 Python 对象(dict、list、字符串、数字、bool 或 None),并返回包含有效 JSON 的 str。 Python 字典看起来与 JSON 对象相似,但本质不同:字典是内存中的 Python 数据结构, 而 JSON 字符串是序列化的文本。调用 json.dumps() 正是弥合了这一差距。
最简示例——单个 CSV 行转 JSON
import json
# A single CSV row represented as a Python dict
server_entry = {
"hostname": "web-prod-03",
"ip_address": "10.0.12.47",
"port": 8080,
"region": "eu-west-1"
}
# Convert dict to JSON string
json_string = json.dumps(server_entry)
print(json_string)
# {"hostname": "web-prod-03", "ip_address": "10.0.12.47", "port": 8080, "region": "eu-west-1"}
print(type(json_string))
# <class 'str'>这会生成紧凑的单行 JSON——适合载荷和存储,但可读性差。 添加 indent=2 可获得人类可读的输出:
import json
server_entry = {
"hostname": "web-prod-03",
"ip_address": "10.0.12.47",
"port": 8080,
"region": "eu-west-1"
}
pretty_json = json.dumps(server_entry, indent=2)
print(pretty_json)
# {
# "hostname": "web-prod-03",
# "ip_address": "10.0.12.47",
# "port": 8080,
# "region": "eu-west-1"
# }另外两个我几乎每次都会用到的参数: sort_keys=True 按字母顺序对字典键排序(对比较不同版本的 JSON 文件非常有用), ensure_ascii=False 保留非 ASCII 字符,而不是将其转义为 \uXXXX 序列。
import json
warehouse_record = {
"sku": "WH-9031",
"location": "上海仓库 3",
"quantity": 240,
"last_audit": "2026-03-10"
}
output = json.dumps(warehouse_record, indent=2, sort_keys=True, ensure_ascii=False)
print(output)
# {
# "last_audit": "2026-03-10",
# "location": "上海仓库 3",
# "quantity": 240,
# "sku": "WH-9031"
# }关于 separators 参数的说明:默认值为 (", ", ": "), 在逗号和冒号后添加空格。如需最紧凑的输出(在 URL 参数中嵌入 JSON 或压缩 API 响应字节数时有用), 传入 separators=(",", ":")。
json.dumps() 将 Python 的 True 转换为 JSON 的 true,将 None 转换为 null,并用双引号包裹字符串 (Python 允许单引号,JSON 不允许)。始终使用 json.dumps() 生成有效 JSON——不要依赖str() 或 repr()。csv.DictReader 到 JSON 文件——完整流程
最常见的实际任务是读取整个 CSV 文件并将其保存为 JSON。 以下是不到 10 行代码的端到端脚本。 csv.DictReader 生成 dict 对象的迭代器——每行一个,以第一行作为键。用 list() 包装可将所有行收集到 Python 列表中,序列化后得到 JSON 数组。
import csv
import json
# Step 1: Read CSV rows into a list of dicts
with open("inventory.csv", "r", encoding="utf-8") as csv_file:
rows = list(csv.DictReader(csv_file))
# Step 2: Write the list as a JSON file
with open("inventory.json", "w", encoding="utf-8") as json_file:
json.dump(rows, json_file, indent=2, ensure_ascii=False)
print(f"Converted {len(rows)} rows to inventory.json")两个 open() 调用:一个读取 CSV,一个写入 JSON。这就是整个模式。 注意这里使用的是 json.dump() (没有 s)——它直接写入文件句柄。 使用 json.dumps() 会返回一个字符串,之后还需要用 f.write() 单独写入。 json.dump() 内存效率更高,因为它流式输出,而不是先在内存中构建完整字符串。
当需要将 JSON 作为字符串而非文件时——用于嵌入 API 载荷、 打印到标准输出或插入数据库列——切换到 json.dumps():
import csv
import json
with open("sensors.csv", "r", encoding="utf-8") as f:
rows = list(csv.DictReader(f))
# Get the JSON as a string instead of writing to a file
json_payload = json.dumps(rows, indent=2)
print(json_payload)
# [
# {
# "sensor_id": "TMP-4401",
# "location": "7号楼 - 2层",
# "reading": "22.4",
# "unit": "celsius"
# },
# ...
# ]单行与完整数据集的区别:调用 json.dumps(single_dict) 得到 JSON 对象({...})。调用 json.dumps(list_of_dicts) 得到 JSON 数组([{...}, {...}])。 外层容器的形状取决于传入的内容。大多数下游消费者期望表格数据以数组形式呈现。
处理非字符串值——从 CSV 进行类型强制转换
有一个问题第一次使用时几乎人人都会遇到: csv.DictReader 将每个值都作为字符串返回。CSV 中的数字 42 在字典中变成了字符串 "42"。如果直接用 json.dumps() 序列化,JSON 中会出现 "quantity": "42" 而非 "quantity": 42。验证类型的 API 会拒绝这种格式。需要显式转换值的类型。
import csv
import json
def coerce_types(row: dict) -> dict:
"""Convert string values to appropriate Python types."""
return {
"sensor_id": row["sensor_id"],
"location": row["location"],
"temperature": float(row["temperature"]),
"humidity": float(row["humidity"]),
"battery_pct": int(row["battery_pct"]),
"active": row["active"].lower() == "true",
}
with open("sensor_readings.csv", "r", encoding="utf-8") as f:
rows = [coerce_types(row) for row in csv.DictReader(f)]
print(json.dumps(rows[0], indent=2))
# {
# "sensor_id": "TMP-4401",
# "location": "7号楼 - 2层",
# "temperature": 22.4,
# "humidity": 58.3,
# "battery_pct": 87,
# "active": true
# }现在 temperature 是浮点数, battery_pct 是整数, active 在 JSON 输出中是布尔值。 类型转换函数针对特定的 CSV 结构——没有通用的方式可以从 CSV 数据中猜测类型, 因此我会为每种 CSV 格式编写一个专用函数。
序列化自定义对象和非标准类型
Python 的 json 模块无法开箱即用地序列化 datetime、 UUID、 Decimal 或自定义类。对这些类型调用 json.dumps() 会抛出 TypeError。 有两种处理方法。
方法一:使用 default= 参数
向 default= 传入一个函数,将未知类型转换为可序列化的内容。该函数仅对 JSON 编码器不知道如何处理的对象调用。
import json
from datetime import datetime
from decimal import Decimal
from uuid import UUID
def json_serial(obj):
"""Fallback serializer for non-standard types."""
if isinstance(obj, datetime):
return obj.isoformat()
if isinstance(obj, UUID):
return str(obj)
if isinstance(obj, Decimal):
return float(obj)
raise TypeError(f"Type {type(obj).__name__} is not JSON serializable")
transaction = {
"txn_id": UUID("a1b2c3d4-e5f6-7890-abcd-ef1234567890"),
"amount": Decimal("149.99"),
"currency": "EUR",
"processed_at": datetime(2026, 3, 15, 14, 30, 0),
"gateway": "stripe",
}
print(json.dumps(transaction, indent=2, default=json_serial))
# {
# "txn_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
# "amount": 149.99,
# "currency": "EUR",
# "processed_at": "2026-03-15T14:30:00",
# "gateway": "stripe"
# }default= 函数末尾抛出 TypeError。 如果返回 None 或静默跳过,输出中会出现 null, 而不会有任何数据丢失的提示。方法二:使用 dataclass 与 asdict()
Python 数据类为 CSV 行提供了正式的类型定义。使用 dataclasses.asdict() 将数据类实例转换为普通字典,然后传入 json.dumps()。
import json
from dataclasses import dataclass, asdict
from datetime import datetime
@dataclass
class ShipmentRecord:
tracking_id: str
origin: str
destination: str
weight_kg: float
shipped_at: datetime
def json_serial(obj):
if isinstance(obj, datetime):
return obj.isoformat()
raise TypeError(f"Not serializable: {type(obj).__name__}")
shipment = ShipmentRecord(
tracking_id="SHP-9827",
origin="上海",
destination="北京",
weight_kg=1240.5,
shipped_at=datetime(2026, 3, 12, 8, 0, 0),
)
print(json.dumps(asdict(shipment), indent=2, default=json_serial))
# {
# "tracking_id": "SHP-9827",
# "origin": "上海",
# "destination": "北京",
# "weight_kg": 1240.5,
# "shipped_at": "2026-03-12T08:00:00"
# }asdict() 会递归地将嵌套数据类转换为字典。 如果数据类包含其他数据类的列表,整个树都会被转换——无需额外代码。json.dumps() 参数参考
json.dumps() 和 json.dump() 接受的完整关键字参数列表。两个函数接受相同的参数—— json.dump() 额外需要一个文件对象作为第一个参数。
csv.DictReader——将 CSV 读取为 Python 字典
csv.DictReader 是 CSV 到 JSON 流程的另一半。它包装文件对象并逐行生成 dict, 以第一行作为字段名。与 csv.reader (生成普通列表)相比,DictReader 允许通过名称访问列——无需使用 row[3] 这样的魔法索引。
import csv
import json
# Tab-separated file from a database export
with open("user_sessions.tsv", "r", encoding="utf-8") as f:
reader = csv.DictReader(f, delimiter="\t")
sessions = list(reader)
print(json.dumps(sessions[:2], indent=2))
# [
# {
# "session_id": "sess_8f2a91bc",
# "user_id": "usr_4421",
# "started_at": "2026-03-15T09:12:00Z",
# "duration_sec": "342",
# "pages_viewed": "7"
# },
# {
# "session_id": "sess_3c7d44ef",
# "user_id": "usr_1187",
# "started_at": "2026-03-15T09:14:22Z",
# "duration_sec": "128",
# "pages_viewed": "3"
# }
# ]csv.DictReader 以惰性方式读取整个文件—— 每次生成一行。调用 list(reader) 会将所有行加载到内存中。 对于数百万行的文件,应采用流式处理方式,而非一次性收集全部数据。从文件和 API 响应转换 CSV
两种生产场景:从磁盘读取 CSV 文件并转换,以及从 API 端点获取 CSV 数据 (许多报表服务返回 CSV)。两者都需要适当的错误处理。
读取 CSV 文件 → 转换 → 写入 JSON
import csv
import json
import sys
def csv_to_json_file(csv_path: str, json_path: str) -> int:
"""Convert a CSV file to JSON. Returns the number of rows written."""
try:
with open(csv_path, "r", encoding="utf-8") as f:
rows = list(csv.DictReader(f))
except FileNotFoundError:
print(f"Error: {csv_path} not found", file=sys.stderr)
sys.exit(1)
except csv.Error as e:
print(f"CSV parse error in {csv_path}: {e}", file=sys.stderr)
sys.exit(1)
with open(json_path, "w", encoding="utf-8") as f:
json.dump(rows, f, indent=2, ensure_ascii=False)
return len(rows)
count = csv_to_json_file("fleet_vehicles.csv", "fleet_vehicles.json")
print(f"Wrote {count} records to fleet_vehicles.json")从 API 获取 CSV → 解析 → JSON
import csv
import io
import json
import urllib.request
def fetch_csv_as_json(url: str) -> str:
"""Fetch CSV from a URL and return it as a JSON string."""
try:
with urllib.request.urlopen(url, timeout=10) as resp:
raw = resp.read().decode("utf-8")
except urllib.error.URLError as e:
raise RuntimeError(f"Failed to fetch {url}: {e}")
reader = csv.DictReader(io.StringIO(raw))
rows = list(reader)
if not rows:
raise ValueError("CSV response was empty or had no data rows")
return json.dumps(rows, indent=2, ensure_ascii=False)
# Example: export endpoint that returns CSV
try:
result = fetch_csv_as_json("https://reports.internal/api/v2/daily-metrics.csv")
print(result)
except (RuntimeError, ValueError) as e:
print(f"Error: {e}")两个示例都在每次文件打开时显式指定 encoding="utf-8"。 对于包含非 ASCII 字符的 CSV 文件——带重音的名称、含特殊字符的地址、CJK 文本——这一点至关重要。 不显式指定编码时,Python 会回退到系统默认值,在 Windows 上通常是 cp1252,会静默损坏多字节字符。
使用 json.loads() 验证 JSON 输出
将 CSV 转换为 JSON 字符串后,可以用 json.loads() 将其解析回来进行验证。 这种往返检测可以发现编码问题、损坏的转义序列,或会导致无效 JSON 的意外字符串拼接。 将调用包装在 try/except 块中。
import json
json_string = json.dumps({"order_id": "ORD-7291", "total": 129.99})
# Verify it is valid JSON by parsing it back
try:
parsed = json.loads(json_string)
print(f"Valid JSON with {len(parsed)} keys")
except json.JSONDecodeError as e:
print(f"Invalid JSON: {e}")
# Valid JSON with 2 keys命令行 CSV 到 JSON 转换
从终端快速转换——无需脚本文件。Python 的 -c 标志可运行内联代码,结果可以通过管道传给 python3 -m json.tool 进行美化打印。
python3 -c " import csv, json, sys rows = list(csv.DictReader(sys.stdin)) json.dump(rows, sys.stdout, indent=2) " < inventory.csv > inventory.json
python3 -c "import csv,json,sys; print(json.dumps(list(csv.DictReader(sys.stdin))))" < data.csv | python3 -m json.tool
python3 -c "import csv,json,sys; json.dump(list(csv.DictReader(sys.stdin)),sys.stdout)" < report.csv | jq .
python3 -m json.tool 是内置的 JSON 格式化工具。 它从标准输入读取 JSON,验证后以 4 个空格缩进打印。 用于验证 CSV 到 JSON 转换是否产生了有效输出非常实用。 如果需要 2 个空格缩进或过滤功能,使用 jq 代替。高性能替代方案——orjson
内置的 json 模块适用于大多数 CSV 文件。但如果需要在循环中处理数万行数据, 或 API 需要对每个请求序列化 CSV 派生的数据, orjson 可快 5–10 倍。它用 Rust 编写,返回 bytes 而非 str, 并原生序列化 datetime、 UUID 和 numpy 数组,无需自定义 default= 函数。
pip install orjson
import csv
import orjson
with open("telemetry_events.csv", "r", encoding="utf-8") as f:
rows = list(csv.DictReader(f))
# orjson.dumps() returns bytes, not str
json_bytes = orjson.dumps(rows, option=orjson.OPT_INDENT_2)
with open("telemetry_events.json", "wb") as f: # note: "wb" for bytes
f.write(json_bytes)
print(f"Wrote {len(rows)} events ({len(json_bytes)} bytes)")API 略有不同: orjson.dumps() 返回 bytes 并使用 option= 标志代替关键字参数。写入 orjson 输出时以二进制写入模式 ("wb")打开文件。 如需字符串,对结果调用 .decode("utf-8")。
终端输出与语法高亮——rich
在终端调试 CSV 到 JSON 转换时,彩色输出会更方便。 rich 库可以渲染带语法高亮的 JSON——键、字符串、数字和布尔值各有不同颜色。
pip install rich
import csv
import json
from rich.console import Console
from rich.syntax import Syntax
console = Console()
with open("deployment_log.csv", "r", encoding="utf-8") as f:
rows = list(csv.DictReader(f))
json_output = json.dumps(rows[:3], indent=2, ensure_ascii=False)
syntax = Syntax(json_output, "json", theme="monokai", line_numbers=True)
console.print(syntax)rich 会在输出中添加 ANSI 转义码。 不要将 rich 格式化的输出写入文件或 API 响应——其中会包含不可见的控制字符。 rich 仅用于终端显示。处理大型 CSV 文件
用 list(csv.DictReader(f)) 加载 500 MB 的 CSV 文件会将整个数据集分配到内存中,然后 json.dump() 在此基础上构建完整的 JSON 字符串。对于超过 50–100 MB 的文件, 应切换到流式处理方式,或写入 NDJSON(换行符分隔的 JSON)——每行一个 JSON 对象。
NDJSON——每行一个 JSON 对象
import csv
import json
def csv_to_ndjson(csv_path: str, ndjson_path: str) -> int:
"""Convert CSV to NDJSON, processing one row at a time."""
count = 0
with open(csv_path, "r", encoding="utf-8") as infile, \
open(ndjson_path, "w", encoding="utf-8") as outfile:
for row in csv.DictReader(infile):
outfile.write(json.dumps(row, ensure_ascii=False) + "\n")
count += 1
return count
rows_written = csv_to_ndjson("access_log.csv", "access_log.ndjson")
print(f"Wrote {rows_written} lines to access_log.ndjson")
# Each line is a standalone JSON object:
# {"timestamp":"2026-03-15T09:12:00Z","method":"GET","path":"/api/v2/orders","status":"200"}
# {"timestamp":"2026-03-15T09:12:01Z","method":"POST","path":"/api/v2/payments","status":"201"}使用 ijson 流式处理大型 JSON 输入
import ijson # pip install ijson
def count_high_value_orders(json_path: str, threshold: float) -> int:
"""Count orders above a threshold without loading the full file."""
count = 0
with open(json_path, "rb") as f:
for item in ijson.items(f, "item"):
if float(item.get("total", 0)) > threshold:
count += 1
return count
# Process a 2 GB JSON file with constant memory usage
high_value = count_high_value_orders("all_orders.json", 500.0)
print(f"Found {high_value} orders above $500")ijson 用于读取大型 JSON 文件—— 写入端使用上述 NDJSON 模式,无论文件大小内存占用都保持恒定。常见错误
问题: json.dumps() 返回字符串。用 f.write() 写入虽然可行,但会在内存中创建不必要的中间字符串——对大型数据集来说浪费资源。
修复: 使用 json.dump(data, f) 直接写入文件对象。它以流式方式输出,无需先构建完整字符串。
json_string = json.dumps(rows, indent=2)
with open("output.json", "w") as f:
f.write(json_string) # unnecessary intermediate stringwith open("output.json", "w", encoding="utf-8") as f:
json.dump(rows, f, indent=2, ensure_ascii=False) # direct write问题: csv.DictReader 将所有值作为字符串返回。JSON 输出中出现 "quantity": "5" 而非 "quantity": 5,会导致强类型 API 消费者报错。
修复: 在序列化前用 int() 或 float() 显式转换数值列。
rows = list(csv.DictReader(f))
json.dumps(rows)
# [{"port": "8080", "workers": "4"}] ← strings, not numbersrows = list(csv.DictReader(f))
for row in rows:
row["port"] = int(row["port"])
row["workers"] = int(row["workers"])
json.dumps(rows)
# [{"port": 8080, "workers": 4}] ← proper integers问题: 在 Windows 上,默认编码是 cp1252。非 ASCII 字符(带重音的名称、CJK 文本)会被静默损坏或引发 UnicodeDecodeError。
修复: 在读取 CSV 和写入 JSON 时,始终向 open() 传入 encoding='utf-8'。
with open("locations.csv", "r") as f: # uses system default encoding
rows = list(csv.DictReader(f))with open("locations.csv", "r", encoding="utf-8") as f:
rows = list(csv.DictReader(f))问题: str(my_dict) 生成 Python 语法(单引号、True、None),不是有效的 JSON。API 和 JSON 解析器会拒绝它。
修复: 始终使用 json.dumps() 生成有效 JSON。它将 True 转为 true,None 转为 null,并使用双引号。
output = str({"active": True, "note": None})
# "{'active': True, 'note': None}" ← NOT valid JSONoutput = json.dumps({"active": True, "note": None})
# '{"active": true, "note": null}' ← valid JSONjson.dumps() 与替代方案——快速对比
对于大多数 CSV 到 JSON 的转换,标准库的 csv + json 组合是正确选择:零依赖、随 Python 自带、处处可用。 当性能分析显示序列化成为瓶颈时,使用 orjson—— 大规模下速度差异是实实在在的。 当还需要数据清洗、过滤或聚合后再转换为 JSON 时,使用 pandas。 如果只需要快速转换而不想写代码,在线 CSV to JSON 转换器可以即时完成。
常见问题
Python 中 json.dump() 和 json.dumps() 有什么区别?
json.dump(obj, file) 将 JSON 输出直接写入类文件对象(任何带有 .write() 方法的对象)。json.dumps(obj) 返回一个格式化的 JSON 字符串。写入文件时使用 json.dump(),需要将 JSON 作为 Python 字符串用于日志记录、嵌入载荷或通过套接字发送时使用 json.dumps()。两个函数接受相同的关键字参数(indent、sort_keys、ensure_ascii、default)。
如何将 Python 字典转换为 JSON 字符串?
调用 json.dumps(your_dict)。返回值是一个包含有效 JSON 的 str。添加 indent=2 可获得可读性更好的输出。如果字典包含非 ASCII 值,传入 ensure_ascii=False 可保留带重音字母或 CJK 文本等字符。
import json
server_config = {"host": "api.internal", "port": 8443, "debug": False}
json_string = json.dumps(server_config, indent=2)
print(json_string)
# {
# "host": "api.internal",
# "port": 8443,
# "debug": false
# }如何将 Python 字典列表保存为 JSON 文件?
以 UTF-8 编码的写入模式打开文件,然后调用 json.dump(your_list, f, indent=2, ensure_ascii=False)。文件输出时始终使用 json.dump()(而非 json.dumps())——它直接写入文件句柄,无需在内存中创建中间字符串。
import json
records = [
{"order_id": "ORD-4821", "total": 129.99, "currency": "USD"},
{"order_id": "ORD-4822", "total": 89.50, "currency": "EUR"},
]
with open("orders.json", "w", encoding="utf-8") as f:
json.dump(records, f, indent=2, ensure_ascii=False)为什么 json.dumps() 会将 True 转为 true、将 None 转为 null?
Python 的布尔值(True、False)和 None 不是有效的 JSON 标记。JSON 规范使用小写的 true、false 和 null。json.dumps() 自动处理这种映射——True 变为 true,False 变为 false,None 变为 null。无需手动转换。反向操作时,json.loads() 会将它们还原为 Python 类型。
将 CSV 数据转换为 JSON 时如何处理 datetime 对象?
向 json.dumps() 传入一个 default= 函数,将 datetime 对象转换为 ISO 8601 字符串。default 函数会对 json 无法原生序列化的任何对象进行调用。对 datetime 实例返回 obj.isoformat(),对其他类型抛出 TypeError。
import json
from datetime import datetime
def json_default(obj):
if isinstance(obj, datetime):
return obj.isoformat()
raise TypeError(f"Not serializable: {type(obj)}")
event = {"action": "login", "timestamp": datetime(2026, 3, 15, 9, 30, 0)}
print(json.dumps(event, default=json_default))
# {"action": "login", "timestamp": "2026-03-15T09:30:00"}不使用 pandas 能将 CSV 转换为 JSON 吗?
可以。Python 标准库提供了所需的一切。使用 csv.DictReader 将每行读取为字典,将行收集到列表中,然后使用 json.dump() 或 json.dumps() 进行序列化。无需第三方库。仅当还需要数据清洗、类型推断,或项目中已经使用 pandas 时,才值得引入它。
import csv
import json
with open("inventory.csv", "r", encoding="utf-8") as csv_file:
rows = list(csv.DictReader(csv_file))
with open("inventory.json", "w", encoding="utf-8") as json_file:
json.dump(rows, json_file, indent=2, ensure_ascii=False)如需无需编写任何 Python 代码的一键转换方式, 试试 CSV to JSON 转换器—— 粘贴 CSV 数据即可立即获得格式化的 JSON 输出。
相关工具
Maria is a backend developer specialising in Python and API integration. She has broad experience with data pipelines, serialisation formats, and building reliable server-side services. She is an active member of the Python community and enjoys writing practical, example-driven guides that help developers solve real problems without unnecessary theory.
Priya is a data scientist and machine learning engineer who has worked across the full Python data stack — from raw data ingestion and cleaning to model deployment and monitoring. She is passionate about reproducible research, Jupyter-based workflows, and the practical engineering side of ML. She writes about NumPy, Pandas, data serialisation, and the Python patterns that make data pipelines reliable at scale.