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

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,经纬度这类范围值会自动拆分并转换,完全不用手动逐个处理,彻底解决循环转换的冗余问题。

使用方法

  1. 把代码里的OLD_SCRIPT和NEW_FILE替换成你的实际文件路径。
  2. 运行脚本,就能自动从旧脚本提取参数并生成新文件了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 08:25:46