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开始)格式不匹配。
错误原因
- JSONL文件以
ascii编码追加时,若CSV内容包含非ASCII字符,json.dump会自动对非ASCII字符进行转义(如将中文转为\uXXXX格式),而原有JSONL数据可能未做转义,导致格式不一致。 - 原CSV读取逻辑未处理可能的编码异常,导致
UnicodeDecodeError。
修正方案
- 统一使用UTF-8编码读写JSONL:放弃ASCII编码,改用UTF-8写入JSONL,避免非ASCII字符的转义问题,保证新旧数据格式一致。
- 增强CSV读取的容错性:在读取CSV时添加错误处理,避免因个别字符编码问题导致程序崩溃。
- 确保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
相关产品推荐
相关产品推荐

