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

Python将CSV列追加至JSONL时遇UnicodeDecodeError问题求助

解决CSV列追加到JSONL的编码与格式问题

问题背景

尝试将CSV文件指定列追加到JSONL文件,原代码运行时抛出UnicodeDecodeError: 'utf-8' codec can't decode byte 0xdb in position 0: unexpected end of data。通过chardet检测到文件编码:

  • CSV文件:UTF-8-SIG(置信度1.0)
  • JSONL文件:ascii(置信度1.0)

改用unicode_escape编码读取CSV可执行追加,但生成的JSONL文件中旧数据(至索引4)与新追加数据(从索引120315开始)格式不匹配。

错误原因

  1. JSONL文件以ascii编码追加时,若CSV内容包含非ASCII字符,json.dump会自动对非ASCII字符进行转义(如将中文转为\uXXXX格式),而原有JSONL数据可能未做转义,导致格式不一致。
  2. 原CSV读取逻辑未处理可能的编码异常,导致UnicodeDecodeError。

修正方案

  1. 统一使用UTF-8编码读写JSONL:放弃ASCII编码,改用UTF-8写入JSONL,避免非ASCII字符的转义问题,保证新旧数据格式一致。
  2. 增强CSV读取的容错性:在读取CSV时添加错误处理,避免因个别字符编码问题导致程序崩溃。
  3. 确保JSONL每行都是合法JSON对象:保持原代码中json.dump后写入换行的逻辑,确保追加的每一行都是独立的JSON对象。

修正后代码

import csv
import json

def csv_column_to_jsonl(csv_file, column_index, jsonl_file):
    # 读取CSV,添加错误处理避免解码异常
    with open(csv_file, 'r', encoding='utf-8-sig', errors='replace') as file:
        reader = csv.reader(file)
        # 如需跳过表头可取消注释
        # next(reader)
        data = []
        for row_num, row in enumerate(reader):
            # 检查列索引有效性,避免越界
            if len(row) > column_index:
                data.append(row[column_index])
            else:
                print(f"警告:第{row_num+1}行数据列数不足,跳过该行")

    # 以UTF-8编码追加写入JSONL,避免ASCII转义
    with open(jsonl_file, 'a', encoding='utf-8') as file:
        for item in data:
            json.dump({"text": item}, file, ensure_ascii=False)
            file.write('\n')

csv_file = 'mydataset.csv'
column_index = 2  
jsonl_file = 'jsondata.jsonl'
csv_column_to_jsonl(csv_file, column_index, jsonl_file)

关键修改点

  • 读取CSV时添加errors='replace',替换无法解码的字符,避免程序崩溃。
  • 写入JSONL时改用encoding='utf-8',并设置json.dump的ensure_ascii=False,直接写入原始字符,不做ASCII转义,保证与原有数据格式一致。
  • 添加列索引检查,避免因CSV行数据列数不足导致的索引越界错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 15:13:37