Python处理分隔符异常CSV:修复列错位及解决NUL错误
解决CSV列错位与"line contains NUL"错误
一、快速修复列错位问题
你的核心问题是部分行因第二列缺失导致字段数不足,直接用pandas就能一步处理,无需手动拆分合并。通过指定列名并自定义异常行的处理逻辑,可让缺失的第二列自动填充NaN:
import pandas as pd # 定义目标列名,与表头一致 target_cols = ['var1', 'var2', 'var3', 'var4', 'var5'] # 读取文件时,对字段数不足的行在第二位置插入空值(会被识别为NaN) df = pd.read_csv( 'myfile.csv', sep=';', names=target_cols, header=0, engine='python', on_bad_lines=lambda row: [row[0], None] + row[1:] )
这段代码中,on_bad_lines的lambda函数会捕获字段数为4的行,将其从[2, 'mary', 34, 78]转换为[2, None, 'mary', 34, 78],完美匹配5列结构,最终得到你想要的结果。
二、解决"line contains NUL"错误
你用csv模块报错是因为文件中存在NUL字符(\x00),默认的csv.reader无法处理这类字符,可通过以下两种方式解决:
方式1:用csv模块过滤NUL并修复行结构
读取时先过滤每行的NUL字符,同时对字段数不足的行插入空值:
import csv with open('myfile.csv', 'r', newline='', encoding='utf-8') as fin, open('output.csv', 'w', newline='', encoding='utf-8') as fout: # 生成器过滤每行的NUL字符 filtered_lines = (line.replace('\x00', '') for line in fin) reader = csv.reader(filtered_lines, delimiter=';') writer = csv.writer(fout, delimiter=';') for row in reader: # 对字段数为4的行,在第二位置插入空字符串 if len(row) == 4: row.insert(1, '') writer.writerow(row)
处理后的output.csv再用pandas读取,既不会错位,也不会触发NUL错误。
方式2:用pandas直接处理带NUL的文件
先读取文件内容并过滤NUL字符,再用StringIO模拟文件对象读取:
import pandas as pd from io import StringIO target_cols = ['var1', 'var2', 'var3', 'var4', 'var5'] with open('myfile.csv', 'r', encoding='utf-8') as f: # 读取全部内容并替换NUL字符 clean_content = f.read().replace('\x00', '') # 用StringIO传递清理后的内容给pandas df = pd.read_csv( StringIO(clean_content), sep=';', names=target_cols, header=0, engine='python', on_bad_lines=lambda row: [row[0], None] + row[1:] )
最终效果
处理后得到的DataFrame符合预期:
var1 var2 var3 var4 var5 0 1 10.0 john 40 56 1 2 NaN mary 34 78 2 3 90.0 smith 52 45
内容的提问来源于stack exchange,提问作者MG Fern
相关产品推荐
相关产品推荐

