Python3脚本自动化改造:解析旧文件时实现字符串转float及信息提取
解决方案:自动化提取旧脚本参数并生成新文件的Python改造方案
看来你需要把从旧脚本(b)提取参数生成新文件(c)的Python脚本(a)改成自动化版本,还要搞定等号参数识别和字符串转float的循环问题。我帮你整理了一套实用的改造方案,直接就能用:
核心需求是从旧脚本里的lev1tolev2行抓出带=的参数,处理经纬度这类带括号的范围值,然后生成固定格式的cam2map输出。下面分两种情况给你代码:精准匹配版(适合格式固定的旧脚本)和通用匹配版(适配参数顺序变化的情况)。
一、精准匹配版(格式固定时首选)
如果旧脚本里的lev1tolev2行格式完全固定,用这个版本效率最高:
import re def parse_old_script(old_script_path): # 用正则精准匹配目标行的所有参数 pattern = r'lev1tolev2 \'from=(\S+) mappars="([^"]+)" targ=(\S+) km=(\d+\.\d+) lat=\(([^,]+),([^)]+)\) lon=\(([^,]+),([^)]+)\)\'' with open(old_script_path, 'r') as f: for line in f: line = line.strip() match = re.match(pattern, line) if match: params = { 'from': match.group(1), 'mappars': match.group(2), 'targ': match.group(3), 'km': match.group(4), 'lat_min': match.group(5), 'lat_max': match.group(6), 'lon_min': match.group(7), 'lon_max': match.group(8) } # 循环批量处理float转换,解决重复转换的冗余问题 float_fields = ['km', 'lat_min', 'lat_max', 'lon_min', 'lon_max'] for field in float_fields: params[field] = float(params[field]) return params return None def generate_new_file(params, new_file_path): # 生成指定格式的cam2map内容 cam2map_content = ( f'cam2map from={params["from"]} to=rsmap-x map=enc.Ink.map pixres=mpp ' f'defaultrange=MAP res=300 minlat={params["lat_min"]} maxlat={params["lat_max"]} ' f'minlon={params["lon_min"]} maxlon={params["lon_max"]}' ) with open(new_file_path, 'w') as f: f.write(cam2map_content + '\n') print(f"✅ 新文件 {new_file_path} 已生成!") if __name__ == "__main__": # 替换成你的实际文件路径 OLD_SCRIPT = "old_script_b.sh" NEW_FILE = "new_file_c.txt" extracted_params = parse_old_script(OLD_SCRIPT) if extracted_params: generate_new_file(extracted_params, NEW_FILE) else: print("❌ 未找到目标lev1tolev2行,请检查旧脚本内容!")
关键说明:
- 等号参数识别:通过正则分组直接捕获每个
key=value的内容,不管是普通字符串、带引号的mappars还是带括号的经纬度,都能精准提取。 - 循环转换float:把需要转float的字段放到列表里,循环遍历转换,避免重复写
float(),完美解决你提到的循环转换冗余问题。
二、通用匹配版(适配参数顺序变化)
如果旧脚本里的lev1tolev2行参数顺序可能变动,用这个更灵活的版本:
import re def parse_old_script_general(old_script_path): with open(old_script_path, 'r') as f: for line in f: line = line.strip() if 'lev1tolev2' not in line: continue # 先提取单引号内的所有内容 content_match = re.search(r'lev1tolev2 \'([^\']+)\'', line) if not content_match: continue content = content_match.group(1) # 匹配所有key=value对,支持带引号、带括号的情况 kv_pairs = re.findall(r'(\w+)=("?[^"\s]+"?|\([^)]+\))', content) params = {} for key, raw_value in kv_pairs: # 去除多余的引号和括号 clean_value = raw_value.strip('"()') if key in ['lat', 'lon']: # 处理经纬度范围,拆分出最小值和最大值 min_val, max_val = clean_value.split(',') params[f'{key}_min'] = float(min_val.strip()) params[f'{key}_max'] = float(max_val.strip()) else: # 自动尝试转换为float,失败则保留原字符串 try: params[key] = float(clean_value) except ValueError: params[key] = clean_value return params return None # 生成新文件的函数和上面一致,直接复用即可 def generate_new_file(params, new_file_path): cam2map_content = ( f'cam2map from={params["from"]} to=rsmap-x map=enc.Ink.map pixres=mpp ' f'defaultrange=MAP res=300 minlat={params["lat_min"]} maxlat={params["lat_max"]} ' f'minlon={params["lon_min"]} maxlon={params["lon_max"]}' ) with open(new_file_path, 'w') as f: f.write(cam2map_content + '\n') print(f"✅ 新文件 {new_file_path} 已生成!") if __name__ == "__main__": OLD_SCRIPT = "old_script_b.sh" NEW_FILE = "new_file_c.txt" extracted_params = parse_old_script_general(OLD_SCRIPT) if extracted_params: generate_new_file(extracted_params, NEW_FILE) else: print("❌ 未找到目标lev1tolev2行,请检查旧脚本内容!")
关键优势:
- 自动识别所有等号参数:不管参数顺序怎么变,都能通过正则找出所有
key=value对,不用修改代码适配顺序。 - 智能类型转换:循环处理每个参数,自动判断是否能转成float,经纬度这类范围值会自动拆分并转换,完全不用手动逐个处理,彻底解决循环转换的冗余问题。
使用方法
- 把代码里的
OLD_SCRIPT和NEW_FILE替换成你的实际文件路径。 - 运行脚本,就能自动从旧脚本提取参数并生成新文件了。
内容的提问来源于stack exchange,提问作者Jon Kay
相关产品推荐
相关产品推荐

