按列合并两个含字符串首列的_4.csv文件时触发列数错误的排查与修复
报错根因
该报错与首列存储字符串没有关联,是多处实现细节缺失叠加导致的:
np.loadtxt内置默认分隔符为任意连续空白字符,并未按照CSV的逗号规则拆分内容。这种拆分逻辑下,首列里的带空格文本(比如示例里的over 40、UHF case)、单元格前后冗余的空格,都会被误判定为列分隔符,导致不同行拆分得到的列数不一致,触发列数校验错误- 维度变换逻辑存在缺陷:
temp_data堆叠完成后形状为(2, 6, 4)(对应2个文件、每个文件6行、每行4列),直接调用transpose()会反向排列所有维度,得到(4, 6, 2)的形状,最终输出的行列结构完全偏离预期的“每行左右拼接两个文件的同位置内容”的效果。
修复步骤
- 调用
np.loadtxt时显式指定逗号为分隔符,关闭默认的空白拆分逻辑 - 对加载的每个单元格做首尾空格剔除,避免合并后出现列错位
- 按明确的轴顺序调整数组维度,确保两个文件的每一行按列左右对齐,而非跨维度错位
修正后的可运行代码
import os import numpy as np # 匹配当前工作目录下所有以_4.csv为后缀的目标文件 files_in_dir = [f for f in os.listdir(os.getcwd()) if f.endswith('_4.csv')] temp_data = [] for filename in files_in_dir: loaded_data = np.loadtxt( filename, dtype='str', delimiter=',', # 显式指定逗号为列分隔符 # 给每列加自动去空格的转换器,兼容单元格前后带冗余空格的场景 converters={col_idx: lambda cell_content: cell_content.strip() for col_idx in range(100)} ) temp_data.append(loaded_data) temp_data = np.array(temp_data) # 维度变换:从(文件数, 行数, 单文件列数) -> (行数, 单文件列数, 文件数) # 拉平最后两维后得到(行数, 总列数)的结构,刚好符合左右列拼接的预期 combined_data = temp_data.transpose(1, 2, 0).reshape(temp_data.shape[1], -1) np.savetxt('_mix.csv', combined_data, fmt='%s', delimiter=',')
避坑提示
- 处理逗号分隔的CSV文件时,必须给
np.loadtxt显式传入delimiter=',',依赖默认空白分隔逻辑大概率会在带空格的文本列上触发解析错误 - 如果目标文件存在表头、空行,可通过
skiprows=1跳过表头、comments=None关闭注释识别逻辑提升兼容性 - 加载完成后需要校验两个文件的行数一致,否则维度变换时会触发shape不匹配的错误
内容的提问来源于stack exchange,提问作者chen abien
相关产品推荐
相关产品推荐

