
本文介绍如何正确处理每行已是合法json字符串的csv文件,避免csv解析导致的额外引号转义,直接将原始json内容写入独立的row_#.json文件。
本文介绍如何正确处理每行已是合法json字符串的csv文件,避免csv解析导致的额外引号转义,直接将原始json内容写入独立的row_#.json文件。
在实际数据处理中,有时会遇到一种特殊格式的“伪CSV”文件:它以CSV为扩展名和分隔方式保存,但每一行本身就是一个完整、合法的JSON字符串(例如 {"name":"Alice","tags":["dev","python"]}),而非传统CSV的多字段结构。若直接按纯文本逐行读取并写入,看似简洁,却可能因文件实际包含CSV转义(如内部逗号、双引号需用 "" 包裹)而被 spreadsheet 工具自动隐藏——导致你看到的是“干净”的JSON,但底层文件内容实为带引号包裹的CSV字段(如 "{"key1":"val"}")。此时若跳过CSV解析直接写入,Python 会把整个带引号的字符串当作字面量写入,造成双重转义。
正确的做法是:使用 csv.reader 解析文件,还原出未经转义的原始JSON字符串,再原样写入JSON文件。关键在于理解 csv.reader 会自动处理CSV规范中的引号转义与字段分割,返回每行为一个字符串列表;由于本例中整行即一个JSON字段,因此只需取 line[0]。
以下是推荐的稳健实现:
import csv
csv_file = 'path/to/my/file.csv'
with open(csv_file, mode='r', newline='', encoding='utf-8') as infile:
reader = csv.reader(infile)
for i, row in enumerate(reader):
if not row: # 跳过空行
continue
json_content = row[0].strip() # 获取首字段,去除首尾空白
with open(f"row_{i}.json", "w", encoding='utf-8') as outfile:
outfile.write(json_content + "\n")
✅ 关键要点说明:
-
newline=''是csv模块的强制要求,防止在Windows下出现额外空行; -
encoding='utf-8'确保中文、特殊符号等不乱码; -
row[0].strip()处理可能存在的首尾空白或换行符,提升健壮性; -
无需
json.loads()→json.dumps()流程:因为输入已是有效JSON字符串,反序列化再序列化不仅低效,还可能改变浮点精度、键序或引入不必要的空格; - 若需验证JSON合法性(建议生产环境启用),可添加异常捕获:
import json
# ... 在写入前插入:
try:
json.loads(json_content) # 验证是否为有效JSON
except json.JSONDecodeError as e:
print(f"Warning: row {i} is not valid JSON — {e}")
continue
最终生成的 row_0.json、row_1.json 等文件内容将与原始CSV中人类可读的JSON完全一致,无任何额外引号包裹,可直接被其他系统或前端应用安全加载。











