兄弟们,我是 N8N大学 的主编。今天咱们聊点硬核的。

很多玩 n8n 的朋友,走到一定阶段都会遇到一个坎:n8n 自带的节点虽然丰富,但处理复杂数据、或者调用一些冷门 API 时,总感觉力不从心。你想写个正则匹配复杂的文本,或者用 pandas 算个加权平均,原生节点能把你配置到怀疑人生。
这时候,如果能直接在 n8n 里写 Python 代码,调用 `pandas`、`requests` 这些神库,那自动化效率直接起飞。今天,笔者就带大家手把手打通这个“任督二脉”,让你在 n8n 里也能享受 Python 生态的红利。
1. 为什么你需要这个“外挂”?
先说说痛点。假设你有一份 Excel 表格,里面有几千行销售数据,需要按日期汇总、计算环比增长率,还要剔除异常值。用 n8n 的原生节点?你可能需要拼凑 5 到 10 个节点,逻辑绕来绕去,维护起来简直是噩梦。
而在 Python 里,这可能就是 10 行代码的事。引入 `pandas`,数据透视表一拉,清洗一下,搞定。或者你想请求一个 API,但它的认证逻辑极其复杂,原生的 HTTP Request 节点配置起来很麻烦,用 `requests` 库配合自定义逻辑,灵活性天差地别。
一句话总结:**n8n 负责流程的编排,Python 负责处理复杂的脏活累活。** 两者结合,才是真正的自动化王者。
2. 核心武器:Code Node
在 n8n 中实现这一切,不需要你部署复杂的 Python 环境,也不需要 Docker 镜像。n8n 已经内置了一个神器——Code Node。
这个节点默认支持 JavaScript,但它是可扩展的。我们需要做的是引入 Python 解释器(Pyodide),让 n8n 能够“听懂” Python。
准备工作:
- 一个 n8n 工作流(废话)。
- 确保你的 n8n 版本不是太老(建议 1.0 以上)。
3. 实战演练:调用 Pandas 处理数据
笔者带大家做一个真实的场景:接收一组 JSON 数据(模拟订单),使用 pandas 进行数据清洗和聚合。
步骤一:准备数据源
我们在工作流中先添加一个 Set 节点(或者叫 Manual Trigger),模拟输入以下 JSON 数据:
[
{"product": "iPhone", "price": 6000, "date": "2023-10-01"},
{"product": "iPhone", "price": 5800, "date": "2023-10-02"},
{"product": "MacBook", "price": 12000, "date": "2023-10-01"},
{"product": "iPad", "price": null, "date": "2023-10-03"}
]
步骤二:添加 Code Node
在数据源后面添加一个 Code 节点。关键点来了,点击 Code Node 右上角的 “Add Parameter”,选择 “Type: Python”。这一步是核心,它会把运行环境切换到 Python 模式。
步骤三:编写 Python 代码
在代码框中输入以下内容。注意,n8n 通过 `n8n` 这个内置对象来交换数据:
import pandas as pd
# 1. 获取 n8n 输入数据
# n8n.inputs.Item() 会返回工作流上游传来的所有数据
input_data = list(n8n.inputs.Item())
# 2. 使用 pandas 处理数据
# 将输入数据转换为 DataFrame
df = pd.DataFrame(input_data)
# 价格为 null 的填充为 0
df['price'] = df['price'].fillna(0)
# 按产品聚合,计算总价
result_df = df.groupby('product')['price'].sum().reset_index()
# 3. 将结果传回 n8n
# 必须将 DataFrame 转换为字典列表
result_data = result_df.to_dict('records')
# 逐条输出,n8n 会自动处理
for item in result_data:
n8n.outputs.Item(item)
运行一下,你会发现输出的数据已经被完美清洗并聚合了。这就是 pandas 的威力!
4. 进阶实战:使用 Requests 发送异步请求
再来看一个场景:处理一批数据,每一条数据都需要调用一次外部 API 获取补充信息。如果用 HTTP Request 节点配合循环,配置起来很繁琐。用 Python 的 `requests` 库就简单多了。
同样是在 Code Node 中,切换到 Python 类型:
import requests
# 获取上游数据
items = list(n8n.inputs.Item())
for item in items:
# 假设 item 里有一个 id 字段
api_url = f"https://api.example.com/users/{item['id']}"
try:
response = requests.get(api_url)
if response.status_code == 200:
# 将 API 返回的数据合并到原数据中
item['extra_info'] = response.json()
n8n.outputs.Item(item)
except Exception as e:
# 错误处理,不要让整个流程挂掉
print(f"Error fetching {item['id']}: {e}")
n8n.outputs.Item(item) # 保持数据流转
注意: 在 n8n 的 Code Node 中运行 `requests`,底层是通过 Pyodide 转译的。对于非常复杂的 HTTPS 证书校验或者某些特殊的网络协议,可能会有兼容性问题。但在 99% 的 RESTful API 调用场景下,它是好用的。
5. 避坑指南:新手必看
在 N8N大学的社群里,关于 Code Node 的报问每天都有。这里总结两个最大的坑:
坑点一:Python 版本与库的支持
n8n 使用的是 Pyodide(WebAssembly 版本的 Python),它不是你电脑上那个完整的 CPython。这意味着你不能使用 `pip install` 随意安装任何库。目前支持的库主要是 numpy, pandas, requests, pyodide 等核心库。如果你需要冷门库,可能需要自己打包或者寻找替代方案。
坑点二:数据类型的隐式转换
Python 和 JavaScript 的数据类型处理有细微差别。比如 Python 的 `None` 传回 n8n 时,有时会被识别为 `null`,有时可能会引起类型错误。建议在 Python 代码的最后,显式地将数据转换为标准的 JSON 格式(字典、列表、字符串、数字),确保 n8n 能正确解析。
6. FAQ 问答
Q1: 在 n8n 里写 Python 代码,是免费的吗?
A: 是的。只要是使用 n8n 官方的 Code Node,不涉及额外的 Docker 镜像构建,都是免费的。但如果你要运行极其消耗资源的 Python 脚本,可能需要考虑 n8n 的执行资源是否足够。
Q2: 为什么我 import numpy 报错?
A: Pyodide 环境需要加载对应的 Module。第一次使用 numpy 或 pandas 时,n8n 可能会在后台下载几 MB 的 WASM 文件,请保持网络通畅。如果还是报错,检查你的 n8n 版本是否支持该库。
Q3: 处理大量数据时效率如何?
A: 对于成千上万行的数据,Pandas 在 Pyodide 中的性能肯定不如在本地服务器运行的原生 Python。但相比在 n8n 节点里拖拖拽拽,效率依然高出几个数量级。如果数据量达到百万级,建议还是通过 Webhook 调用外部 Python 服务处理。
7. 总结与资源
在 n8n 中使用 Python,是把低代码的“快”和代码的“强”结合在了一起。不要把 n8n 当作一个只能点点鼠标的玩具,把它当作一个容器,装入你的逻辑和代码,它就能变成真正的生产力工具。
推荐阅读:
- n8n 官方 Code Node 文档:了解最新的 API 变动
- Pyodide 官方文档:查看支持的 Python 库列表
我是 N8N大学 的主编,希望这篇教程能帮你解决数据处理的难题。如果卡住了,随时回来翻翻。