用 Python 自动创建 Markdown 表格 - 每天5分钟玩转 GPT 编程系列(4)
1. 他们居然问我要 Prompts
早几天我用 GPT-4 写了一个 Golang Worker Pool 程序,测试了一把居然性能爆表,然后“他们”就问我要完整的 prompts,想看下到底是 GPT-4 写出来的 GoPool,还是我自己手撕的。(我哪有手撕的本事,你们还真是看得起我。)
GoPool 是一个 95% 代码用 GPT-4 生成的高性能、功能强大且简单易用的 Golang Worker Pool 开源库,详细介绍可以参考这篇文章:
好吧,那我就搞一个网站,把 GoPool 开发过程中用到的 prompts 以及对应的 commits 都列在一起,开源出去!
首先我需要在网页里加这样一张表格:
没错,表格的原始文本得是 Markdown 格式的,然后被转成 HTML(我总不能手撕 HTML 表格吧),放到 pro.devchat.ai。
这个表格对应的 Markdown 最终会长这样:
混乱不?抓狂不?我反正写了一行就放弃了:
| Commit | Commit Hash | Author | Prompts with GPT | 给 GPT 的 Prompts |
| :---------------------------------------------------------------------------------------------------------------------------------- | :---------- | :------------------------------------------- | :------------------------------------------------------------------------ | :---------------------------------------------------------------------------- |
| [Add README.md and go.mod for GoPool project](https://github.com/devchat-ai/gopool/commit/a6315922a026b4290b0b1cd54e95b25e93538047) | a631592 | [Daniel Hu](https://github.com/daniel-hutao) | [Prompts with GPT](./commits/a6315922a026b4290b0b1cd54e95b25e93538047.md) | [给 GPT 的 Prompts](./commits/a6315922a026b4290b0b1cd54e95b25e93538047_zh.md) |
写完一行,老眼昏花,内心久久不能平静。这种“重体力活”怎么能忍?
你想象一下我要到 GitHub 上的 GoPool 项目 commits 列表里,看着接近30个 commits,一个个去摘抄这些信息:
- Commit message 第一行;
- Commit hash 前7位;
- Author 信息;
- 完整的 commit 地址;
然后在本地创建和 commit 地址对应的一个个 Markdown 文件,类似:
- a6315922a026b4290b0b1cd54e95b25e93538047.md
- a6315922a026b4290b0b1cd54e95b25e93538047_zh.md
最后还要在这些 Markdown 文件里将这个 commit 对应的 Prompts 填进去,让大家看到这个效果:
真他喵不是人干的活。赶紧冲一杯咖啡提提神,搞不完今天下不了班了。
有事 GPT 干,没事干 GPT,有事 GPT 干,没事干 GPT,有事 GPT 干,没事干 GPT……
对呀,脏活累活,一律祭出 GPT!
2. 让 GPT-4 来写代码
直觉上这个任务适合用 Python 脚本来实现。不过我并不熟悉 Python,也就是说如果 GPT-4 给的 Python 代码能用,我就用。反之不能用,我就不得不自己用 Golang 来写了。
下文通过 DevChat 和 GPT-4 交互。DevChat 是一款开源的 VS Code 插件,默认对接 GPT-4,现在还在公测阶段,可以通过这个地址免费注册一个 key,然后不需要“ke xue 上网”就能用上 GPT-4 了。
关于 DevChat 的详细介绍欢迎跳转这篇文章:
2.1 我对 DevChat 说
如上图所示,在问这个问题的时候我加了一个“上下文”,也就是一行 Markdown 表格示例。
完整的问题如下:
我需要你写一个 python 脚本,脚本中要实现的功能是拉取GitHub上特定项目的Commit记录,然后写入本地特定文件中。
- 比如项目的 org 是 devchat-ai,name 是 gopool,那么你要找的项目是 https://github.com/devchat-ai/gopool
- 你要获取这个项目的main分支的所有 commits 历史,按照时间顺序依次写入本地的 devchat-ai/gopool/index.md 的中,但是你要考虑脚本重复执行需要幂等,所以你应该追加内容,而不是覆盖。
- 我已经将 index.md 的例子发给你,你不需要管里面的开头描述部分,只需要在文件后半部分的 Markdown 表格上操作。
2.2 DevChat 回答
要实现这个需求,我们需要做以下几步:
- 使用 GitHub API 来获取特定项目的 commit 历史记录。
- 解析 API 返回的数据,提取我们需要的信息,如 commit hash,author 等。
- 将这些信息以 Markdown 表格的形式追加到本地的 index.md 文件中。
这里有一个 Python 脚本的示例,它使用了 requests
库来发送 HTTP 请求,使用 pandas
库来处理和写入 Markdown 表格。如果你的环境中没有这两个库,你可以使用 pip 来安装它们:
pip install requests pandas
然后,你可以使用以下的 Python 脚本来实现你的需求:
import requests
import pandas as pd
from typing import Dict, List
def get_commits(org: str, repo: str) -> List[Dict[str, str]]:
url = f"https://api.github.com/repos/{org}/{repo}/commits"
response = requests.get(url)
response.raise_for_status()
commits = response.json()
return [
{
"Commit": commit["commit"]["message"],
"Commit Hash": commit["sha"],
"Author": commit["commit"]["author"]["name"],
}
for commit in commits
]
def append_commits_to_file(commits: List[Dict[str, str]], file_path: str) -> None:
df = pd.DataFrame(commits)
with open(file_path, "a") as f:
f.write(df.to_markdown(index=False))
def main():
org = "devchat-ai"
repo = "gopool"
file_path = "devchat-ai/gopool/index.md"
commits = get_commits(org, repo)
append_commits_to_file(commits, file_path)
if __name__ == "__main__":
main()
这个脚本首先从 GitHub API 获取 commit 历史记录,然后将这些记录追加到本地的 index.md 文件中。注意,这个脚本只会获取最近的 30 条 commit 记录,因为 GitHub API 的默认分页大小是 30。如果你需要获取更多的记录,你需要处理 API 的分页。
此外,这个脚本没有处理 API 的错误和异常,你可能需要根据你的需求来增加错误处理和异常处理的代码。
管它三七二十一,对着操作一波再说。运行后我得到了这个结果:
一口老血啊…… 克制,不动怒,继续“友好”沟通。
2.3 我又对 DevChat 说
hash 我只需要保留7位,Commit Message 只需要保留第一行。最后的结果需要是这样的:
| [Add GoPool and Worker structures](https://github.com/devchat-ai/gopool/commit/ee0b38ba85830d07046145583c2a568905d9839f) | ee0b38b | [Daniel Hu](https://github.com/daniel-hutao) | [Prompts with GPT](./commits/a6315922a026b4290b0b1cd54e95b25e93538047.md) | [给 GPT 的 Prompts](./commits/a6315922a026b4290b0b1cd54e95b25e93538047_zh.md) |
2.4 DevChat 的第二轮回答
了解了,我们需要对获取到的 commit 数据进行一些处理,以满足你的需求。具体来说,我们需要:
- 将 commit hash 截取为前 7 位。
- 只保留 commit message 的第一行。
- 生成 commit 的链接。
- 生成 commit 的作者的链接。
以下是修改后的 Python 脚本:
import requests
import pandas as pd
from typing import Dict, List
def get_commits(org: str, repo: str) -> List[Dict[str, str]]:
url = f"https://api.github.com/repos/{org}/{repo}/commits"
response = requests.get(url)
response.raise_for_status()
commits = response.json()
return [
{
"Commit": f"[{commit['commit']['message'].split('\n')[0]}](https://github.com/{org}/{repo}/commit/{commit['sha']})",
"Commit Hash": commit["sha"][:7],
"Author": f"[{commit['commit']['author']['name']}](https://github.com/{commit['author']['login']})",
"Prompts with GPT": f"[Prompts with GPT](./commits/{commit['sha']}.md)",
"给 GPT 的 Prompts": f"[给 GPT 的 Prompts](./commits/{commit['sha']}_zh.md)",
}
for commit in commits
]
def append_commits_to_file(commits: List[Dict[str, str]], file_path: str) -> None:
df = pd.DataFrame(commits)
with open(file_path, "a") as f:
f.write(df.to_markdown(index=False))
def main():
org = "devchat-ai"
repo = "gopool"
file_path = "devchat-ai/gopool/index.md"
commits = get_commits(org, repo)
append_commits_to_file(commits, file_path)
if __name__ == "__main__":
main()
这个脚本现在会生成你需要的 Markdown 表格,并将其追加到 index.md 文件中。
很快 DevChat 就给出了回答,不过这次的代码有语法错误:
一开始我就说了,我并不熟悉 Python。所以这里看似一个挺简单的错误,反正我改不来。所以,继续问 GPT-4 咯。
2.5 我再次对 DevChat 说
Escape sequence (backslash) not allowed in expression portion of f-string prior to Python 3.12
2.6 DevChat 回答
对不起,我犯了一个错误。在 f-string 表达式部分,我们不能使用反斜杠作为转义字符。在这种情况下,我们可以先将 commit message 分割成行,然后在 f-string 中使用第一行。以下是修改后的代码:
import requests
import pandas as pd
from typing import Dict, List
def get_commits(org: str, repo: str) -> List[Dict[str, str]]:
url = f"https://api.github.com/repos/{org}/{repo}/commits"
response = requests.get(url)
response.raise_for_status()
commits = response.json()
commit_data = []
for commit in commits:
commit_message_title = commit['commit']['message'].split('\n', 1)[0]
commit_data.append({
"Commit": f"[{commit_message_title}](https://github.com/{org}/{repo}/commit/{commit['sha']})",
"Commit Hash": commit["sha"][:7],
"Author": f"[{commit['commit']['author']['name']}](https://github.com/{commit['author']['login']})",
"Prompts with GPT": f"[Prompts with GPT](./commits/{commit['sha']}.md)",
"给 GPT 的 Prompts": f"[给 GPT 的 Prompts](./commits/{commit['sha']}_zh.md)",
})
return commit_data
def append_commits_to_file(commits: List[Dict[str, str]], file_path: str) -> None:
df = pd.DataFrame(commits)
with open(file_path, "a") as f:
f.write(df.to_markdown(index=False))
def main():
org = "devchat-ai"
repo = "gopool"
file_path = "devchat-ai/gopool/index.md"
commits = get_commits(org, repo)
append_commits_to_file(commits, file_path)
if __name__ == "__main__":
main()
这个脚本现在应该可以正常运行,生成你需要的 Markdown 表格,并将其追加到 index.md 文件中。
我再次运行了下这个代码,终于,表格出来了。
2.7 最后效果
后面我还继续聊了几轮,让 GPT-4 把本地创建表格中出现的 Markdown 文件的逻辑也加上了,所以最后我顺利的通过 Python 脚本生成了下图中的这个巨大无比的表格,以及对应的左侧五十多个 Markdown 文件。
Python 代码最终版本如下:
import os
import requests
import pandas as pd
from typing import Dict, List
def get_commits(org: str, repo: str) -> List[Dict[str, str]]:
url = f"https://api.github.com/repos/{org}/{repo}/commits"
response = requests.get(url)
response.raise_for_status()
commits = response.json()
commit_data = []
for commit in commits:
commit_message_title = commit['commit']['message'].split('\n', 1)[0]
commit_data.append({
"Commit": f"[{commit_message_title}](https://github.com/{org}/{repo}/commit/{commit['sha']})",
"Commit Hash": commit["sha"],
"Author": f"[{commit['commit']['author']['name']}](https://github.com/{commit['author']['login']})",
"Prompts with GPT": f"[Prompts with GPT](./commits/{commit['sha']}.md)",
"给 GPT 的 Prompts": f"[给 GPT 的 Prompts](./commits/{commit['sha']}_zh.md)",
})
return commit_data
def append_commits_to_file(commits: List[Dict[str, str]], file_path: str) -> None:
df = pd.DataFrame(commits)
df['Commit Hash'] = df['Commit Hash'].apply(lambda x: x[:7])
with open(file_path, "a") as f:
f.write(df.to_markdown(index=False))
def create_commit_files(commit: Dict[str, str], directory: str = "devchat-ai/gopool/commits") -> None:
"""
Create markdown files for each commit.
"""
for suffix in ["", "_zh"]:
file_path = os.path.join(directory, f"{commit['Commit Hash']}{suffix}.md")
if not os.path.exists(file_path):
with open(file_path, "w") as f:
f.write("")
def main():
org = "devchat-ai"
repo = "gopool"
file_path = "devchat-ai/gopool/index.md"
commits = get_commits(org, repo)
append_commits_to_file(commits, file_path)
for commit in commits:
create_commit_files(commit)
if __name__ == "__main__":
main()
3. 他们居然让我要写总结
那就总结一下吧。
今天挑战的是让 GPT-4 用我不熟悉的 Python 语言来完成一个自动化任务。
像这种大表格的编辑以及相应的50+个文件的创建,手动操作是很容易出错的,这类活天然适合交给 Python 脚本。不过放在以前,可能这种活我只能选择用自己熟悉的其他高级语言来完成,可以预见 Python 50 行代码对应的 Golang 估计得小100行了。100行啊,一杯水,一包烟,一个脚本写半天。不过现在可以让 GPT-4 来完成这类工作。
几轮“自然语言沟通”就搞定了,算下来可能花了不到30分钟,大约就是:0.5h VS 2.5h 吧。
又是 N 倍效率的一天,马克杯里的咖啡都还没凉,事情又干完了。呼…… 下班,等吃饭!
用 Python 自动创建 Markdown 表格 - 每天5分钟玩转 GPT 编程系列(4)的更多相关文章
- 创建 Rex-Ray volume - 每天5分钟玩转 Docker 容器技术(76)
前面我们安装部署了 Rex-Ray,并且成功配置 VirtualBox backend,今天演示如何创建和使用 Rex-Ray volume. 在 docker1 或 docker2 上执行如下命令创 ...
- python XlsxWriter创建Excel 表格
文档(英文) https://xlsxwriter.readthedocs.io/index.html 常用模块说明(中文) https://blog.csdn.net/sinat_35930259/ ...
- 创建 Pool & VIP - 每天5分钟玩转 OpenStack(122)
上节完成了 LBaaS 配置,今天我们开始实现如下 LBaaS 环境. 环境描述如下: 1. 创建一个 Pool “web servers”. 2. 两个 pool member “WEB1” 和 “ ...
- 创建 flat network - 每天5分钟玩转 OpenStack(87)
上一节我们讨论了 flat network 的原理,今天就来创建 "flat_net" 并分析底层网络的实现. 打开菜单 Admin -> Networks,点击 “Crea ...
- 创建 overlay 网络 - 每天5分钟玩转 Docker 容器技术(50)
上一节我们搭建好实验环境,配置并运行了consul,今天开始创建 overlay 网络. 在 host1 中创建 overlay 网络 ov_net1: -d overlay 指定 driver 为 ...
- 创建 macvlan 网络 - 每天5分钟玩转 Docker 容器技术(55)
上一节我们准备好了 macvlan 的实验环境,今天在 host1 和 host2 中创建 macvlan 网络 mac_net1: 注意:在 host2 中也要执行相同的命令. ① -d macvl ...
- 创建 router 连通 subnet- 每天5分钟玩转 OpenStack(100)
上一节我们为 Neutron 虚拟路由器配置好了 L3 agent,今天将创建虚拟路由器“router_100_101”,打通 vlan100 和 vlan101. 打开操作菜单 Project -& ...
- 创建 floating IP - 每天5分钟玩转 OpenStack(106)
先复习一下前面我们讨论的知识. 当租户网络连接到 Neutron router,通常将 router 作为默认网关.当 router 接收到 instance 的数据包,并将其转发到外网时: 1. r ...
- 如何将Excel转换成Markdown表格[转]
在这篇文章中,我将告诉你如何快速的将Excel转换为markdown表格,以及如何将Google Docs,Numbers,网页中的表格或其他类似Excel的程序数据转换为Markdown表格 你可能 ...
- Python数据展示 - 生成表格图片
前言 前一篇文章介绍了推送信息到企业微信群里,其中一个项目推送的信息是使用Python自动生成的表格,本文来讲讲如何用Python生成表格图片. 选一个合适库 Python最大的优点就是第三方库丰富, ...
随机推荐
- 利用css var函数让你的组件样式输出规范样式API,可定制性更高;
我们平时在使用Elementui Antdesing这些UI库时,难免会碰到使用deep强行侵入式去修改组件内部样式的情况: 比如下列代码,我们需要把ant的分页样式进行高度自定义,就得使用dee ...
- PropertyGrid实现文件选择项
原来公司的一段代码,现在给朋友写的软件里也用上了,看样用处挺多,所以保存一下. 自定义属性类: using System; using System.Collections.Generic; usin ...
- 带你简单了解Chatgpt背后的秘密:大语言模型所需要条件(数据算法算力)以及其当前阶段的缺点局限性
带你简单了解Chatgpt背后的秘密:大语言模型所需要条件(数据算法算力)以及其当前阶段的缺点局限性 1.什么是语言模型? 大家或多或少都听过 ChatGPT 是一个 LLMs,那 LLMs 是什么? ...
- 【GiraKoo】C++编译中常用的内置宏
开源项目:https://girakoo.com/ 联系方式:girakoo@163.com 简介 针对不同的平台,很多头文件,函数名称,类型占用空间不一致. 为了保证跨平台可编译,经常需要在项目中使 ...
- ET介绍——组件式设计(优化版的ECS)
组件式设计 在代码复用和组织数据方面,面向对象可能是大家第一反应.面向对象三大特性继承,封装,多态,在一定程度上能解决不少代码复用,数据复用的问题.不过面向对象不是万能的,它也有极大的缺陷: 1. 数 ...
- Factory Method Pattern 工厂方法模式简介与 C# 示例【创建型】【设计模式来了】
〇.简介 1.什么是工厂方法模式? 一句话解释: 实体类和工厂类均为单独实现,不影响已实现的类,方便扩展. 工厂方法模式(Factory Method Pattern)是一种创建型模式,它允许客户 ...
- Python连接es笔记四之创建和删除操作
本文首发于公众号:Hunter后端 原文链接:Python连接es笔记四之创建和删除操作 这一篇笔记介绍一下索引和数据的创建和删除. 其实对于索引来说,如果可以接触到 kibana 的话,可以很方便的 ...
- Oracle Linux切换uek内核到rhck内核解决ACFS兼容问题
背景:协助客户做验证,客户使用的是RHEL7.6环境,我这边是OEL7.6环境,开始以为区别不大,结果acfs兼容还是遇到问题,特此记录下. 现象:asmca图形没有acfs相关内容,无法使用acfs ...
- Kubernetes(k8s)定时任务:CronJob
目录 一.系统环境 二.前言 三.Kubernetes CronJob简介 四.kubernetes CronJob和Linux crontab对比 五.CronJob表达式语法 六.创建CronJo ...
- 明解STM32—GPIO应用设计篇之IO外部中断EXTI原理及使用方法
一.前言 在之前针对STM32的GPIO相关API函数及配置使用进行了详细的介绍,GPIO作为输入引脚时,调用相关读信号引脚函数接口就可以在程序的循环中,轮询的对输入信号进行读取检测操作,除了轮询的 ...