影刀RPA 数据类型转换实战数字字符串日期互转大全作者林焱什么情况用这个在影刀里写流程时最常遇到的报错不是指令用错了而是类型不匹配。从网页上抓下来的价格是字符串199.00Excel里读出来的是数字199.0你想比较大小就报错了。日期更麻烦网页显示的是2025年3月15日你要写入数据库的却是2025-03-15格式。影刀的Python节点和内置指令对类型的要求不完全一样。你可能在Python节点里能混用到【IF条件】里就报错。搞清楚每种类型之间的转换规则是写出不报错流程的基本功。这篇文章把所有你在影刀中会遇到的类型转换场景全部覆盖从简单到复杂带完整例子。怎么做第一步影刀中的四种核心类型先搞清楚影刀里变量的基本类型类型说明示例来源字符串(str)文本199.00,已完成网页抓取、文件读取数字(int/float)整数/小数199,199.00Excel读取、计算布尔值(bool)真假True,False条件判断结果列表(list)数组[A,B,C]ForEach、多元素获取影刀的【IF条件】里比较两个值必须类型一致。字符串100和数字100比较会怎样不会报错但结果可能不是你想要的——影刀会尝试自动转换但转换规则不是你说了算。铁律在【IF条件】里比较之前先确认类型一致。第二步字符串 ← 数字的互相转换这是最频繁的转换场景。网页上抓下来的全是字符串店群矩阵自动化突破运营极限# 字符串 → 数字 price_str199.00# 从网页上抓的价格stock_str356# 从网页上抓的库存percent_str85.5%# 带百分号# 标准转换price_floatfloat(price_str)# 199.0stock_intint(stock_str)# 356# 带符号的字符串需要预处理price_str_dirty¥199.00clean_priceprice_str_dirty.replace(¥,).strip()pricefloat(clean_price)# 199.0percentfloat(percent_str.replace(%,))/100# 0.855# 数字 → 字符串 amount199.00count356# 标准转换amount_strstr(amount)# 199.0 — 注意会丢失.00count_strstr(count)# 356# 格式化转换推荐amount_strf{amount:.2f}# 199.00count_strf{count:05d}# 00356补零到5位money_strf¥{amount:,.2f}# ¥199.00在影刀内置指令中的转换【数值计算】指令会自动处理类型但【IF条件】里的比较不会。所以在比较前用Python节点把字符串转数字。第三步日期字符串的转换日期是最容易出错的转换因为格式千变万化fromdatetimeimportdatetime# 各种格式的日期字符串 → datetime对象 date_formats[2025-03-15,# ISO格式2025/03/15,# 斜杠分隔2025年3月15日,# 中文格式03/15/2025,# 美式格式2025-3-15 14:30:00,# 带时间20250315,# 紧凑格式]defparse_date(date_str):智能日期解析date_strdate_str.strip()# 尝试多种常见格式formats[%Y-%m-%d %H:%M:%S,%Y-%m-%d,%Y/%m/%d %H:%M:%S,%Y/%m/%d,%Y年%m月%d日 %H:%M:%S,%Y年%m月%d日,%m/%d/%Y,%Y%m%d,%Y-%m-%dT%H:%M:%S,# ISO 8601]forfmtinformats:try:returndatetime.strptime(date_str,fmt)exceptValueError:continueraiseValueError(f无法解析日期格式:{date_str})# 使用示例web_date2025年3月15日dtparse_date(web_date)print(dt)# 2025-03-15 00:00:00# datetime对象 → 字符串 dtdatetime(2025,3,15,14,30,0)# 各种输出格式dt.strftime(%Y-%m-%d)# 2025-03-15dt.strftime(%Y年%m月%d日)# 2025年03月15日dt.strftime(%Y-%m-%d %H:%M:%S)# 2025-03-15 14:30:00dt.strftime(%Y%m%d)# 20250315dt.strftime(%m/%d/%Y)# 03/15/2025第四步列表与字符串的互转从网页批量抓取数据后常常需要把列表转成字符串存到Excel或者把字符串拆成列表来逐个处理# 字符串 → 列表 tag_strRPA,自动化,影刀,Pythontag_listtag_str.split(,)# [RPA, 自动化, 影刀, Python]# 多行文本拆成列表text第一行 第二行 第三行linestext.strip().split(\n)# [第一行, 第二行, 第三行]# 空白分隔raw张三 李四 王五namesraw.split()# [张三, 李四, 王五]# 列表 → 字符串 tag_list[RPA,自动化,影刀]tag_str,.join(tag_list)# RPA,自动化,影刀line_str\n.join(tag_list)# RPA\n自动化\n影刀# 数字列表 → 字符串numbers[1,2,3,4,5]num_str,.join(str(n)forninnumbers)# 1,2,3,4,5第五步布尔值的转换陷阱# 各种值 → 布尔值 # Python的bool()函数规则bool()# False — 空字符串bool(abc)# True — 非空字符串bool(0)# False — 数字0bool(1)# True — 非0数字bool([])# False — 空列表bool([1,2])# True — 非空列表bool(None)# False# 但网页上的文字 是/否 不会自动转布尔web_value是# 从网页抓的# ❌ bool(web_value) → True因为非空字符串# ✅ 正确做法is_yesweb_value.strip()in[是,Yes,yes,Y,y,1]第六步影刀内置指令与Python节点的类型桥接影刀内置指令的变量传到Python节点时类型可能发生隐式转换# 这是影刀Python节点中的代码# 假设从影刀变量面板读入了变量 price_from_web 和 count_from_excel# 第一步确认并转换类型pricefloat(str(price_from_web))ifprice_from_webelse0.0countint(str(count_from_excel))ifcount_from_excelelse0# 第二步计算totalprice*count# 第三步结果转回字符串给影刀内置指令用result_strf总金额¥{total:.2f}# 第四步写入影刀变量供后续指令使用# 在Python节点的输出中设置变量 result_str核心原则Python节点入口处统一做类型检查和转换出口处把结果转成明确类型。第七步批量类型转换当你有大量数据需要统一转换时# 批量处理从Excel读入的混合类型数据raw_data[{商品:A,价格:199.00,库存:356,日期:2025-03-15},{商品:B,价格:299.50,库存:128,日期:2025-03-16},]defnormalize_row(row):统一格式化一行数据return{商品:str(row[商品]),价格:float(str(row[价格]).replace(,,)),库存:int(row[库存]),日期:datetime.strptime(row[日期],%Y-%m-%d),}clean_data[normalize_row(row)forrowinraw_data]有什么坑坑一float 转字符串后多出很多小数位现象price199.00print(str(price))# 输出 199.0 而不是 199.00原因float(199.00)在内存里就是199.0。解决格式化输出永远是安全的price_strf{price:.2f}# 199.00坑二含逗号的数字直接转float失败现象从网页上抓的价格是1,299.00直接float(1,299.00)报ValueError。解决temu店群自动化报活动案例price_str1,299.00pricefloat(price_str.replace(,,))# 1299.0坑三空值处理遗漏现象采集结果中有空值类型转换时报错。解决永远先判空再转换defsafe_float(value,default0.0):安全转floatifvalueisNoneorstr(value).strip():returndefaulttry:returnfloat(str(value).replace(,,).replace(¥,))exceptValueError:returndefaultdefsafe_int(value,default0):安全转intifvalueisNoneorstr(value).strip():returndefaulttry:returnint(float(str(value).replace(,,)))except(ValueError,TypeError):returndefault坑四日期字符串中混入了不可见字符现象从网页复制的日期2025-03-15看起来正常但strptime解析报错。原因网页中可能混入了全角空格、零宽字符。解决importre date_strre.sub(r[\u200b\u200c\u200d\u200e\u200f\ufeff\u00a0],,date_str)date_strdate_str.strip().replace(\u3000, )# 全角空格→半角空格坑五时间戳的时区混淆现象API返回的时间戳1710464400转换成日期后发现差了8小时。原因时间戳通常是UTC时间中国是UTC8。fromdatetimeimportdatetime,timezone,timedelta timestamp1710464400# 带时区转换utc_timedatetime.fromtimestamp(timestamp,tztimezone.utc)cn_timeutc_time.astimezone(timezone(timedelta(hours8)))print(cn_time.strftime(%Y-%m-%d %H:%M:%S))总结类型转换没有捷径靠的就是入口检查、安全转换、出口明确的纪律。养成在每个Python节点开头做类型检查的习惯——多写两行少花两小时排查。
影刀RPA 数据类型转换实战:数字字符串日期互转大全
影刀RPA 数据类型转换实战数字字符串日期互转大全作者林焱什么情况用这个在影刀里写流程时最常遇到的报错不是指令用错了而是类型不匹配。从网页上抓下来的价格是字符串199.00Excel里读出来的是数字199.0你想比较大小就报错了。日期更麻烦网页显示的是2025年3月15日你要写入数据库的却是2025-03-15格式。影刀的Python节点和内置指令对类型的要求不完全一样。你可能在Python节点里能混用到【IF条件】里就报错。搞清楚每种类型之间的转换规则是写出不报错流程的基本功。这篇文章把所有你在影刀中会遇到的类型转换场景全部覆盖从简单到复杂带完整例子。怎么做第一步影刀中的四种核心类型先搞清楚影刀里变量的基本类型类型说明示例来源字符串(str)文本199.00,已完成网页抓取、文件读取数字(int/float)整数/小数199,199.00Excel读取、计算布尔值(bool)真假True,False条件判断结果列表(list)数组[A,B,C]ForEach、多元素获取影刀的【IF条件】里比较两个值必须类型一致。字符串100和数字100比较会怎样不会报错但结果可能不是你想要的——影刀会尝试自动转换但转换规则不是你说了算。铁律在【IF条件】里比较之前先确认类型一致。第二步字符串 ← 数字的互相转换这是最频繁的转换场景。网页上抓下来的全是字符串店群矩阵自动化突破运营极限# 字符串 → 数字 price_str199.00# 从网页上抓的价格stock_str356# 从网页上抓的库存percent_str85.5%# 带百分号# 标准转换price_floatfloat(price_str)# 199.0stock_intint(stock_str)# 356# 带符号的字符串需要预处理price_str_dirty¥199.00clean_priceprice_str_dirty.replace(¥,).strip()pricefloat(clean_price)# 199.0percentfloat(percent_str.replace(%,))/100# 0.855# 数字 → 字符串 amount199.00count356# 标准转换amount_strstr(amount)# 199.0 — 注意会丢失.00count_strstr(count)# 356# 格式化转换推荐amount_strf{amount:.2f}# 199.00count_strf{count:05d}# 00356补零到5位money_strf¥{amount:,.2f}# ¥199.00在影刀内置指令中的转换【数值计算】指令会自动处理类型但【IF条件】里的比较不会。所以在比较前用Python节点把字符串转数字。第三步日期字符串的转换日期是最容易出错的转换因为格式千变万化fromdatetimeimportdatetime# 各种格式的日期字符串 → datetime对象 date_formats[2025-03-15,# ISO格式2025/03/15,# 斜杠分隔2025年3月15日,# 中文格式03/15/2025,# 美式格式2025-3-15 14:30:00,# 带时间20250315,# 紧凑格式]defparse_date(date_str):智能日期解析date_strdate_str.strip()# 尝试多种常见格式formats[%Y-%m-%d %H:%M:%S,%Y-%m-%d,%Y/%m/%d %H:%M:%S,%Y/%m/%d,%Y年%m月%d日 %H:%M:%S,%Y年%m月%d日,%m/%d/%Y,%Y%m%d,%Y-%m-%dT%H:%M:%S,# ISO 8601]forfmtinformats:try:returndatetime.strptime(date_str,fmt)exceptValueError:continueraiseValueError(f无法解析日期格式:{date_str})# 使用示例web_date2025年3月15日dtparse_date(web_date)print(dt)# 2025-03-15 00:00:00# datetime对象 → 字符串 dtdatetime(2025,3,15,14,30,0)# 各种输出格式dt.strftime(%Y-%m-%d)# 2025-03-15dt.strftime(%Y年%m月%d日)# 2025年03月15日dt.strftime(%Y-%m-%d %H:%M:%S)# 2025-03-15 14:30:00dt.strftime(%Y%m%d)# 20250315dt.strftime(%m/%d/%Y)# 03/15/2025第四步列表与字符串的互转从网页批量抓取数据后常常需要把列表转成字符串存到Excel或者把字符串拆成列表来逐个处理# 字符串 → 列表 tag_strRPA,自动化,影刀,Pythontag_listtag_str.split(,)# [RPA, 自动化, 影刀, Python]# 多行文本拆成列表text第一行 第二行 第三行linestext.strip().split(\n)# [第一行, 第二行, 第三行]# 空白分隔raw张三 李四 王五namesraw.split()# [张三, 李四, 王五]# 列表 → 字符串 tag_list[RPA,自动化,影刀]tag_str,.join(tag_list)# RPA,自动化,影刀line_str\n.join(tag_list)# RPA\n自动化\n影刀# 数字列表 → 字符串numbers[1,2,3,4,5]num_str,.join(str(n)forninnumbers)# 1,2,3,4,5第五步布尔值的转换陷阱# 各种值 → 布尔值 # Python的bool()函数规则bool()# False — 空字符串bool(abc)# True — 非空字符串bool(0)# False — 数字0bool(1)# True — 非0数字bool([])# False — 空列表bool([1,2])# True — 非空列表bool(None)# False# 但网页上的文字 是/否 不会自动转布尔web_value是# 从网页抓的# ❌ bool(web_value) → True因为非空字符串# ✅ 正确做法is_yesweb_value.strip()in[是,Yes,yes,Y,y,1]第六步影刀内置指令与Python节点的类型桥接影刀内置指令的变量传到Python节点时类型可能发生隐式转换# 这是影刀Python节点中的代码# 假设从影刀变量面板读入了变量 price_from_web 和 count_from_excel# 第一步确认并转换类型pricefloat(str(price_from_web))ifprice_from_webelse0.0countint(str(count_from_excel))ifcount_from_excelelse0# 第二步计算totalprice*count# 第三步结果转回字符串给影刀内置指令用result_strf总金额¥{total:.2f}# 第四步写入影刀变量供后续指令使用# 在Python节点的输出中设置变量 result_str核心原则Python节点入口处统一做类型检查和转换出口处把结果转成明确类型。第七步批量类型转换当你有大量数据需要统一转换时# 批量处理从Excel读入的混合类型数据raw_data[{商品:A,价格:199.00,库存:356,日期:2025-03-15},{商品:B,价格:299.50,库存:128,日期:2025-03-16},]defnormalize_row(row):统一格式化一行数据return{商品:str(row[商品]),价格:float(str(row[价格]).replace(,,)),库存:int(row[库存]),日期:datetime.strptime(row[日期],%Y-%m-%d),}clean_data[normalize_row(row)forrowinraw_data]有什么坑坑一float 转字符串后多出很多小数位现象price199.00print(str(price))# 输出 199.0 而不是 199.00原因float(199.00)在内存里就是199.0。解决格式化输出永远是安全的price_strf{price:.2f}# 199.00坑二含逗号的数字直接转float失败现象从网页上抓的价格是1,299.00直接float(1,299.00)报ValueError。解决temu店群自动化报活动案例price_str1,299.00pricefloat(price_str.replace(,,))# 1299.0坑三空值处理遗漏现象采集结果中有空值类型转换时报错。解决永远先判空再转换defsafe_float(value,default0.0):安全转floatifvalueisNoneorstr(value).strip():returndefaulttry:returnfloat(str(value).replace(,,).replace(¥,))exceptValueError:returndefaultdefsafe_int(value,default0):安全转intifvalueisNoneorstr(value).strip():returndefaulttry:returnint(float(str(value).replace(,,)))except(ValueError,TypeError):returndefault坑四日期字符串中混入了不可见字符现象从网页复制的日期2025-03-15看起来正常但strptime解析报错。原因网页中可能混入了全角空格、零宽字符。解决importre date_strre.sub(r[\u200b\u200c\u200d\u200e\u200f\ufeff\u00a0],,date_str)date_strdate_str.strip().replace(\u3000, )# 全角空格→半角空格坑五时间戳的时区混淆现象API返回的时间戳1710464400转换成日期后发现差了8小时。原因时间戳通常是UTC时间中国是UTC8。fromdatetimeimportdatetime,timezone,timedelta timestamp1710464400# 带时区转换utc_timedatetime.fromtimestamp(timestamp,tztimezone.utc)cn_timeutc_time.astimezone(timezone(timedelta(hours8)))print(cn_time.strftime(%Y-%m-%d %H:%M:%S))总结类型转换没有捷径靠的就是入口检查、安全转换、出口明确的纪律。养成在每个Python节点开头做类型检查的习惯——多写两行少花两小时排查。