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

Python read_csv参数异常与.inp文件读取修改写入技术求助

咱们一步步来解决这两个问题:

问题1:解决read_csv指定sep时的两类异常

情况1:所有数据挤到同一列

这大概率是你选的分隔符和文件实际用的对不上:

  • 如果文件里是多个空格/制表符混着用的,别直接写sep=' ',换成sep='\s+'(能匹配任意数量的空白),再加上skipinitialspace=True,就能自动忽略字段前面的空格;
  • 要是分隔符是逗号加空格(就像你示例里CG行的格式),得写sep=', '而不是只写sep=',',不然每个字段前面的空格会被当成值的一部分,甚至可能让pandas认错字段;
  • 另外,如果文件里的分隔符乱七八糟(有的行用逗号,有的用空格),试试加个engine='python',pandas的C引擎对格式要求严,Python引擎更灵活,能应付这种不规范的情况。

情况2:提示「第X行预期N个字段,但实际看到M个」

这个是因为文件里有的行字段数和其他行不一样,解决办法分三种:

  • 要是确定这些行是无效数据,直接加on_bad_lines='skip'跳过就行(老版本pandas用error_bad_lines=False);
  • 想保留这些行又不想报错,就用on_bad_lines='warn',程序会给个警告但继续读;
  • 最稳妥的是先按行读文件,把异常行预处理成统一格式,再转成DataFrame,比如给缺字段的行补空值,或者把多字段的行拆分。

问题2:.inp文件的读取、修改与写入

你的.inp文件不是标准结构化CSV,前后有格式特殊的行,中间是CG开头的结构化行,直接用read_csv不太合适,建议按行读取后逐行处理:

完整代码示例

# 1. 读取所有行到列表
with open('source_file.inp', 'r', encoding='utf-8') as f:
    lines = f.readlines()

total_lines = len(lines)
# 确定需要修改的行范围:跳过前5行和最后3行
start_process_idx = 5
end_process_idx = total_lines - 3  # 最后3行的索引是 total_lines-3 ~ total_lines-1,所以处理到 total_lines-4 为止

# 2. 逐行修改中间行的第二个数字
for i in range(start_process_idx, end_process_idx):
    line = lines[i].strip()
    if not line:
        continue  # 跳过空行
    
    # 按逗号+空格分割字段(匹配示例中CG行的格式)
    parts = line.split(', ')
    # 只处理CG开头且字段数足够的行
    if len(parts) >= 2 and parts[0] == 'CG':
        try:
            # 修改第二个数字(这里示例为原数字+10,你可以替换成自己的逻辑)
            original_num = float(parts[1])
            modified_num = original_num + 10
            parts[1] = str(modified_num)
            # 重新拼接成行并保留换行符
            lines[i] = ', '.join(parts) + '\n'
        except ValueError:
            print(f"警告:第{i+1}行的第二个元素不是有效数字,已跳过")

# 3. 写入新的.inp文件
with open('modified_file.inp', 'w', encoding='utf-8') as f:
    f.writelines(lines)

代码说明

  • 按行读取:用readlines()把所有行存入列表,方便精准修改特定位置的行;
  • 行范围控制:前5行索引为0-4,最后3行索引为total_lines-3到total_lines-1,所以中间需要处理的是索引5到total_lines-4的行;
  • 字段修改:针对CG开头的行,按, 分割后修改第二个数字,处理完成后重新拼接成行;
  • 异常防护:加入try-except避免非数字格式的行导致程序崩溃,保证健壮性。

如果中间行的分隔符不是统一的, ,你可以根据实际情况调整分割逻辑,比如用split()(默认按任意空白分割)或者正则表达式分割。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 08:26:12