AWS SageMaker JupyterLab中txt追加写入后pandas CSV解析异常报错
问题根因
- 你使用追加模式(
a)打开classes.txt,且写入标签时没有添加换行符:代码中classes.write(uni_label)写入的Organisation\tUniversity末尾无换行,每次运行代码时新的标签内容会直接拼接在上一次写入的内容末尾,导致单行的制表符数量不断增加,字段数随运行次数递增,最终触发Expected 2 fields in line 50, saw 9报错。 - 业务逻辑冗余:
University标签已经存在于classes.txt中,无需每次运行代码都重复追加,重复写入也会导致标签映射重复。
修复方案
第一步:修复已损坏的标签文件
手动打开classes.txt,删除末尾拼接的所有重复标签行,确保每一行仅含1个制表符、2个字段。
第二步:修改代码逻辑
修改写入classes.txt的逻辑,增加存在性判断,同时补充换行符,示例代码如下:
import os import random # 提前判断标签是否已存在,避免重复写入 uni_label = 'Organisation\tUniversity' label_exist = False if os.path.exists('classes.txt'): with open('classes.txt', 'r', encoding='utf-8') as f: for line in f: if line.strip() == uni_label: label_exist = True break # 仅标签不存在时才追加,且写入时补充换行符 if not label_exist: with open('classes.txt', 'a', encoding='utf-8') as classes: classes.write(f"{uni_label}\n") # 训练集验证集写入逻辑可根据业务需求选择是否保留追加模式 train = open('train_textcorrupted.csv', 'a') val = open('val.csv', 'a') n_pad = 4 for i in range(len(unis)-n_pad): record = ' '.join(unis[i:(i+n_pad)]) full_record = f'{uni_label}\t{record}\n' if random.random() > 0.9: val.write(full_record) else: train.write(full_record) val.close() train.close()
可选兜底方案
如果后续仍可能出现格式异常的行,可在pandas读取classes.txt时增加跳过错误行的参数,避免直接报错终止运行:
# pandas 1.3+ 版本使用 self._raw_labels = pd.read_csv(classes_file, header=None, sep='\t', on_bad_lines='skip') # 旧版本pandas使用 self._raw_labels = pd.read_csv(classes_file, header=None, sep='\t', error_bad_lines=False)
内容的提问来源于stack exchange,提问作者StressedBoi69420
相关产品推荐
相关产品推荐

