ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

toxic-repos数据转换原理揭秘:convert_database_to_other_formats.py源码全解读(SQLite→JSON/CSV)

toxic-repos数据转换原理揭秘:convert_database_to_other_formats.py源码全解读(SQLite→JSON/CSV) toxic-repos数据转换原理揭秘convert_database_to_other_formats.py源码全解读SQLite→JSON/CSV【免费下载链接】toxic-reposWe are against discrediting open source software项目地址: https://gitcode.com/gh_mirrors/to/toxic-repostoxic-repos 是一个专门记录「有毒开源仓库」的开源安全项目其核心价值在于把威胁数据以 SQLite、JSON、CSV 三种格式同步维护。本文为你完整解读数据转换工具convert_database_to_other_formats.py的转换原理——它如何用不到 40 行 Python 代码把 SQLite 数据库一键转换成 JSON 和 CSV 文件。无需复杂知识看完即可理解整个数据流转过程。 先认识 toxic-repos一份开源威胁情报库toxic-repos 的目标是「反对诋毁开源软件」。当热门开源项目被塞入恶意代码、政治标语或 DDoS 攻击工具时项目会把相关仓库登记到数据库中方便社区排查和举报参见 HOW-TO-REPORT.md。数据全部存放在data/目录下的三种格式中格式文件位置用途SQLitedata/sqlite/toxic-repos.sqlite3主数据库记录的「唯一真实来源」JSONdata/json/toxic-repos.json方便程序读取CSVdata/csv/toxic-repos.csv方便 Excel 打开分析目前数据库中有 700 多条记录每条记录包含 8 个字段id编号、datetime发现时间、problem_type问题类型、name仓库名、commit_link恶意提交链接、description问题描述、PURL-link包链接、PURL包标识。 转换脚本在哪里做了什么核心脚本是 convert_database_to_other_formats.py它只做一件事读取 SQLite 数据库中的repos表重新写出 JSON 和 CSV 两个文件。脚本开头用 3 行代码把路径写死第 9~12 行DATABASE_PATH Path(data/sqlite/toxic-repos.sqlite3) # 数据源 JSON_OUTFILE_PATH Path(data/json/toxic-repos.json) # 输出 1 CSV_OUTFILE_PATH Path(data/csv/toxic-repos.csv) # 输出 2这种「SQLite 为主、其他格式派生」的设计保证了三种文件永远一致只要运行一次脚本JSON 和 CSV 就会与数据库完全同步。⚙️ 转换原理分四步拆解第 1 步连接数据库并执行查询脚本使用 Python 内置的sqlite3库连接数据库第 16 行然后执行一条最简单的 SQL第 19 行SELECT * FROM repos ORDER BY problem_typeORDER BY problem_type让记录按问题类型如ddos、malware、broken_assembly排序转换出的文件天然就是「同类问题聚在一起」的方便人工浏览。第 2 步动态获取表头而不是写死列名这是整个脚本最巧妙的一处第 21~22 行column_datas list(execute_result) # 取出所有数据行 row_names list(map(lambda x: x[0], cursor.description)) # 动态取列名cursor.description是 SQLite 游标自带的「表头描述」脚本直接从中提取 8 个列名。这样做的好处是将来即使给repos表加一列脚本一行都不用改转换结果会自动带上新列。第 3 步生成 JSON——把「行」变成「对象」数据库里每条记录是一个「元组」一行数据但 JSON 需要的是「字典」键值对。脚本用一个字典推导式第 25~31 行把列名和数据值一一配对json_data [ {row_names[index]: data for index, data in enumerate(column_data)} for column_data in column_datas ]效果就像把表格的「一行」翻译成「一条带标签的记录」例如{ id: 4, name: fomvasss/laravel-dadata, problem_type: broken_assembly }写入时还有两个贴心细节第 32~33 行ensure_asciiFalse保证俄文等描述文字原样保存而不是变成\uXXXX转义indent4让 JSON 带缩进、可读性好。第 4 步生成 CSV——先写表头再逐行写入CSV 部分只有 5 行第 36~40 行先writerow(row_names)写入表头再循环把每一行数据写入。注意打开文件时带了newline参数这是为了避免在 Windows 上出现多余空行——是写 CSV 时的标准姿势。 如何自己跑一遍转换脚本整个过程非常简单克隆 toxic-repos 仓库进入项目根目录路径常量是相对路径必须在根目录运行执行python3 scripts/convert_database_to_other_formats.py打开data/json/toxic-repos.json或data/csv/toxic-repos.csv确认文件时间戳已更新。 小贴士新增记录并不直接改这三个文件。项目提供了另一个脚本 add_line_to_sqlite.py它带参数校验仓库名格式、提交链接格式、问题类型枚举值往 SQLite 中安全插入一条新记录后再运行转换脚本即可让 JSON/CSV 同步更新。 总结这套设计教会我们什么convert_database_to_other_formats.py 虽然只有 44 行却是一个「单一数据源 格式派生」的经典范例单一真实来源SQLite 是唯一权威数据JSON/CSV 只是「视图」避免三处数据各自修改后不一致元数据驱动用cursor.description动态取列名让脚本对表结构变化「零维护」面向用户的细节ensure_asciiFalse保留中文/俄文可读性indent4保证 JSON 美观最小依赖只用了 Python 标准库sqlite3、json、csv无需安装任何第三方包。理解了这个脚本你也就掌握了处理「数据库 → 交换格式」这一类任务的最小完整思路。【免费下载链接】toxic-reposWe are against discrediting open source software项目地址: https://gitcode.com/gh_mirrors/to/toxic-repos创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表