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
相关产品推荐
相关产品推荐

