Django admin 导出 CSV 完整指南:从编码到权限、性能优化
前阵子帮一个内部运营后台加“Django admin 后台数据导出 csv”功能刚开始以为就是用csv模块写个 HttpResponse 的事真做起来才发现里面藏着不少坑Excel 打开中文乱码、文件名变成一堆百分号、导出来的时间格式没法直接看、外键全是 id、想导出筛选后的全部数据时 admin 自带 action 又不够用。这篇文章把完整的实现思路、可抄的代码、和踩过坑之后才明白的一些细节一起讲清楚。如果你也是给 Django admin 加导出功能建议先别急着写代码看完第一部分再动手。因为选错方案后面返工很痛苦同一个需求有人只要勾几条导出有人要导出当前筛选条件的整页数据还有人要控制权限、记录审计这些会直接影响代码结构。1. 先判断你需要的到底是“勾选导出”还是“筛选结果导出”1.1 这功能不只是“管理员偷懒”它解决的是数据流转一开始我接到需求时某同事的原话是“后台列表能不能加个按钮把数据导成 Excel” 听起来很简单但背后的真实场景是业务方每天要在另一个系统里批量处理一批记录。如果他们只能靠肉眼复制粘贴既慢又容易错而且一旦数据量超过几百行Excel 里的格式和筛选就很难维持。所以导出功能实际解决的是“系统与系统之间、系统与人之间的数据交接问题”。决定方案之前先要问清楚几个问题导出的是选中的几条还是符合某个筛选条件的全部数据导出的字段是列表页可见的那几列还是要包含更多业务字段谁有权限导出导出的数据是否需要留痕数据量是几千行还是几十万行这些问题答案不同技术路径完全不同。最典型的分岔路是第一个admin 自带的 action 只能处理“用户在列表页勾选后选中的数据”而如果要导出“当前筛选条件下全部数据”你需要自己加一个列表页工具栏按钮。1.2 三条实现路线怎么选实现“Django admin 导出 CSV”常见路线有三条我简单对比一下方案适用场景优点缺点admin action勾选几条或当前页数据导出代码量最小admin 原生支持无法直接覆盖筛选后的全部数据自定义列表页按钮 自定义 URL导出当前筛选结果、带有权限控制灵活可完全控制查询条件和导出格式需要覆盖 admin 模板代码略多第三方库 django-import-export同时要做导入导出、复杂格式功能全有 XLSX、CSV、模板导入引入依赖、定制逻辑反而不如自己写灵活我第一次做的版本用的是 admin action因为当时需求确实是“选中几条导出”。后来业务方说“我要把筛选之后的两千多条全部导出来”我意识到 action 天然满足不了这个场景——用户如果在列表页不勾选记录直接点执行后台得到的 queryset 是空的。后面我把方案升级成“列表页工具栏按钮 复用 admin 的 ChangeList 解析筛选条件”效果很好。这两套代码我会分别放在下面两节里。2. 用 Admin Action 实现最基础的 CSV 导出2.1 先写一个导出函数Django admin 的 action 本质是一个接收modeladmin、request、queryset三个参数的可调用对象。你在列表页勾选记录、选择动作、点击执行Django 会把选中的记录整理成 queryset 传给这个函数。先看最简单的一版代码假设模型是ProjectX要把它的 id、名称、状态、创建时间导出。# admin.py import csv from urllib.parse import quote from django.contrib import admin from django.http import HttpResponse admin.action(description导出选中记录为 CSV) def export_selected_csv(modeladmin, request, queryset): response HttpResponse(content_typetext/csv; charsetutf-8) response.write(\ufeff) response[Content-Disposition] attachment; filename*UTF-8{}.format( quote(导出数据.csv) ) writer csv.writer(response) writer.writerow([ID, 名称, 状态, 创建时间]) for obj in queryset.iterator(): writer.writerow([ obj.id, obj.name, obj.get_status_display(), obj.created_at.strftime(%Y-%m-%d %H:%M:%S), ]) return response这里有三个关键点第一response.write(\ufeff)不是可有可无的。CSV 文件如果只声明charsetutf-8用 Excel 直接打开很可能是乱码。加一个 UTF-8 BOM 后Excel 才会正确识别编码。这个问题几乎每个第一次写导出功能的人都会碰到。第二Content-Disposition里用的filename*UTF-8...是 RFC 5987 的标准写法配合urllib.parse.quote中文文件名才能正常显示。如果不做这一步浏览器下载出来的文件名可能是一串百分号编码。第三queryset.iterator()可以避免一次性把整张表加载到内存。对于几千行的后台数据差别不大但数据量上来以后这个习惯能少踩很多性能坑。2.2 注册 Action、指定要导出的字段函数定义之后把它注册进 ModelAdmin 的actions列表即可。class ProjectXAdmin(admin.ModelAdmin): list_display (name, status, owner, created_at) list_filter (status, created_at) search_fields (name,) actions [export_selected_csv] admin.site.register(ProjectX, ProjectXAdmin)这里我要特别提醒一句不要为了图省事直接把model._meta.fields循环出来自动生成表头。那样确实少写几行代码但会带来三个问题外键字段默认导出的是 id业务方看到owner: 10086根本不知道是谁很多字段值比如get_status_display()需要手动处理ManyToManyField和模型属性无法直接通过_meta.fields获取。我的习惯是维护一个显式的导出字段列表或者写一个_serialize_value函数明确每个字段怎么处理。后面第 4 节会展开讲。显式字段虽然多几行代码但可控性是最好的。2.3 注册 Action、指定要导出的字段这里补充一个兼容性说明如果你用的是 Django 3.2 以下版本admin.action装饰器可能不可用。老版本写法是def export_selected_csv(modeladmin, request, queryset): ... return response export_selected_csv.short_description 导出选中记录为 CSV class ProjectXAdmin(admin.ModelAdmin): actions [export_selected_csv]这个写法在任何版本都能跑只是没有装饰器那么优雅。如果你在升级项目要注意 action 的short_description不能和已有 action 重名否则下拉菜单里会出两个显示一样的动作点起来会分不清。3. 把导出按钮放到列表页工具栏导出当前筛选结果3.1 为什么光有 Action 不够Admin action 的核心局限我之前说过了它的 queryset 来自用户勾选的记录。很多后台场景下用户其实是希望“我选好了筛选条件列表里现在看到的这些数据全部导出来”。虽然 admin 列表页也有“选择全部”的勾选逻辑但对于跨页数据行为并不直观用户也很难确定自己是否真的选中了全部筛选结果。所以更稳妥的方案是在列表页工具栏加一个“导出当前筛选结果 CSV”的按钮按钮链接带着当前页面的筛选参数点击后直接生成文件。这个方案需要处理三件事覆盖模板、注册自定义 URL、复用 ChangeList 拿到筛选后的查询集。3.2 在列表页工具栏加一个导出按钮Django admin 的 change list 页面是可以通过覆盖模板来扩展的。你可以在 app 的templates/admin/app_label/model_name/change_list.html里增加内容。假设应用名是myapp模型叫ProjectX目录结构就是templates/ └── admin/ └── myapp/ └── projectx/ └── change_list.html模板内容如下{% extends admin/change_list.html %} {% block object-tools-items %} {{ block.super }} li a classbutton hrefexport-csv/?{{ request.GET.urlencode }} 导出当前筛选结果 CSV /a /li {% endblock %}注意我用的是相对链接export-csv/。因为 change list 页面的 URL 是admin/myapp/projectx/浏览器会解析成admin/myapp/projectx/export-csv/不需要写死 app label。request.GET.urlencode会把当前列表页的搜索关键字、筛选条件、排序字段、页码都带过去。页码其实可以不带但多带了也不会有太大问题我们导出时用不到它。然后在 ModelAdmin 里对应指定模板文件并告诉 admin 生成 URL 时路由到自定义视图from django.urls import path class ProjectXAdmin(admin.ModelAdmin): change_list_template admin/myapp/projectx/change_list.html def get_urls(self): urls super().get_urls() custom_urls [ path( export-csv/, self.admin_site.admin_view(self.export_filtered_csv), name{}_projectx_export_csv.format( self.model._meta.app_label ), ), ] return custom_urls urls3.3 复用 ChangeList 拿到筛选后的数据接下来是核心的export_filtered_csv视图。我选择复用 Django admin 内部的ChangeList类把它在列表页做筛选、搜索的那一套逻辑直接拿过来这样我们导出时看到的数据和用户列表页看到的数据能保持一致。from django.contrib.admin.views.main import ChangeList def export_filtered_csv(self, request): cl ChangeList( request, self.model, self.list_display, self.list_display_links, self.list_filter, self.date_hierarchy, self.search_fields, self.list_select_related, self.list_per_page, self.list_max_show_all, self.list_editable, self, ) export_queryset cl.queryset response HttpResponse(content_typetext/csv; charsetutf-8) response.write(\ufeff) response[Content-Disposition] attachment; filename*UTF-8{}.format( quote(筛选结果.csv) ) writer csv.writer(response) writer.writerow([ID, 名称, 状态, 创建时间]) for obj in export_queryset.iterator(): writer.writerow([ obj.id, obj.name, obj.get_status_display(), obj.created_at.strftime(%Y-%m-%d %H:%M:%S), ]) return response这里要提醒一句ChangeList是 Django admin 内部实现里偏底层的类不在“公共稳定 API”的承诺范围内。也就是说Django 大版本升级时它的构造参数可能变。我的建议是如果项目 Django 版本升级这个导出视图一定要单独跑一遍冒烟测试。也可以把这段逻辑封装在一个独立函数里方便以后修补。另外如果你在export_filtered_csv里只需要筛选后的数据集不需要分页不用调用cl.get_results(request)。cl.queryset本身就是完整查询集分页只是改变cl.result_list不影响它。4. 字段序列化外键、时间、布尔值别直接塞进 CSV4.1 外键显示 id 还是显示名称这是导出功能里最常见的“看起来没毛病实际上没法用”的坑。直接把外键对象放进csv.writer它会调用str(obj)如果模型没有定义__str__导出来的就是一串 id。业务方看到owner_id完全不知道是谁。比较推荐的做法是导出时明确处理外键显示字段。例如owner_name obj.owner.display_name if obj.owner else 如果没有display_name至少用str(obj.owner)。更重要的是不要为了省事把所有外键字段都放进一个导出函数里最好和表头形成一一对应关系。我看到过有些代码把两个相似字段搞反了导出以后对不齐定位问题很麻烦。4.2 时间用本地化格式还是 ISO 格式时间字段的导出格式也要提前想清楚。如果数据要给财务或者运营看建议统一用%Y-%m-%d %H:%M:%SExcel 可以直接按列排序人眼也能快速识别。如果数据要作为接口导入到另一个系统用datetime.isoformat()可能更合适因为它是标准格式没有时区歧义。在同一个导出文件里时间格式最好不要混搭。我之前遇到过一份 CSV有的行是2024-01-05 09:00:00有的行是2024-01-05T09:00:0008:00业务方拿 Excel 做透视表时直接出了一堆脏数据。4.3 布尔值和 None 怎么处理布尔值直接导出成True/FalseExcel 不一定会按布尔处理。更常见的是导出成“是 / 否”或“1 / 0”看业务场景。None 我不建议直接写成字符串None这样下游判断时容易误判。建议统一填成空字符串或者填一个业务语义明确的占位符比如“未知”。我一般会写一个统一的字段序列化函数放在导出模块里复用def to_csv_value(value): if value is None: return if isinstance(value, bool): return 1 if value else 0 if isinstance(value, (datetime, date)): return value.strftime(%Y-%m-%d %H:%M:%S) return str(value)这个函数虽然简单但能把散落在各个导出函数里的类型判断收拢到一起后续维护起来轻松很多。具体字段对照可以参考下面这个表格字段类型推荐导出格式原因DateTimeField%Y-%m-%d %H:%M:%SExcel 可识别、可排序DateField%Y-%m-%d简单直观BooleanField是/否 或 1/0避免True/False被判成文本ForeignKey业务名称字段显示 id 无意义choices字段get_status_display()显示中文意义ManyToManyField用竖线或分号拼接避免和 CSV 逗号分隔混淆5. 权限控制、操作审计和误操作防护5.1 导出也是一种敏感操作后台能导出数据本质上就是一个“数据外带”的通道。如果列表页能看到一万条客户手机号而导出按钮没有任何权限限制那这个功能就是个安全后门。Django admin 的权限模型默认是按模型级别的 add/change/delete/view 来控制的。如果希望只有特定角色能导出最好在模型 Meta 里自定义一个权限。class ProjectX(models.Model): ... class Meta: permissions [ (export_projectx_csv, Can export projectx csv), ]然后在 action 或自定义视图里检查if not request.user.has_perm(myapp.export_projectx_csv): modeladmin.message_user(request, 没有导出权限, levelERROR) return None需要注意has_perm需要用户先有模型的 view 权限否则列表页本身都进不来。如果项目用的是自定义权限后端这段判断逻辑要跟着调整。5.2 加一个“确认导出”中间页有些敏感数据导出前最好让用户二次确认防止手滑导出一大批并不需要的数据。admin action 本身没有确认页但 Django admin 处理删除操作时会走一个确认中间页原理就是“动作函数返回一个渲染后的响应”。如果你走的是自定义 URL 方案可以单独做一个页面先展示筛选条件、条数和导出的字段范围让用户点“确认导出”再真正生成 CSV。这样可以挡住不少误操作尤其是那种一上来就把全部历史数据导出的事情。5.3 记录导出日志出事能追溯导出日志的重要性往往要等到出问题才发现。我建议至少记录谁导出的、什么时间、筛选条件是什么、导出了多少行。可以通过logging或直接写一张审计表。最简单的做法import logging logger logging.getLogger(django.request) logger.info( user %s exported %s rows from projectx, filters%s, request.user.username, export_queryset.count(), request.GET.urlencode(), )这里不建议在每导出一次就执行一次count()因为count()会额外发一条聚合查询。但如果数据量不大或者你把日志里的“行数”当成参考值可以用。真正要求严格的场景可以直接在循环里计数但我更建议导出完成后用len(list(export_queryset))这种一次性结果去统计——虽然这也会加载数据但至少不会多跑一条 SQL。如果用 action 方案日志里没有筛选条件就记录“勾选了哪些记录”的 id 列表。注意数量很多时不要全记截断前几百个即可。6. 数据量大了怎么办性能优化与排错速查6.1 iterator() 不一定解决所有问题很多人以为加了queryset.iterator()就万事大吉其实不是。Django 的queryset.iterator()确实可以避免把整张查询结果一次性放进 QuerySet 缓存但它仍然是逐条从数据库游标里取数据然后马上写进 HttpResponse。HttpResponse 本身会把响应体按字符串形式积累在内存里数据量到几十万行时这一条响应的内存占用依然可能让服务卡顿。如果确实有超大导出建议改用StreamingHttpResponse。我贴一个可用的思路import io import csv from django.http import StreamingHttpResponse def csv_stream(queryset): buffer io.StringIO() writer csv.writer(buffer) yield \ufeff writer.writerow([ID, 名称, 状态, 创建时间]) yield buffer.getvalue() buffer.seek(0) buffer.truncate(0) for obj in queryset.iterator(): writer.writerow([ obj.id, obj.name, obj.get_status_display(), obj.created_at.strftime(%Y-%m-%d %H:%M:%S), ]) yield buffer.getvalue() buffer.seek(0) buffer.truncate(0) def export_large_csv(self, request): response StreamingHttpResponse( csv_stream(self.get_queryset(request)), content_typetext/csv; charsetutf-8, ) response[Content-Disposition] attachment; filename*UTF-8{}.format( quote(大数据导出.csv) ) return response这里每次让 writer 写入一个临时缓冲区再把缓冲区内容 yield 给流式响应。好处是内存不会随着数据量线性增长。但要注意StreamingHttpResponse的 body 不能在返回后随便修改所以如果你的代码里还要写入审计日志建议在生成器全部迭代完成后记录。6.2 减少字段比优化循环更有用导出慢很多时候不是 Python 循环慢而是 SQL 查出来的字段太多。如果在 ModelAdmin 的get_queryset里指定了select_related或prefetch_related来优化列表页展示导出的时候这些关联数据也会被带上。字段和关联越多序列化成本越高。我的经验是导出视图单独用一个queryset.only(...)或者values_list(...)来限定字段。如果导出内容只是几个标量字段values_list的速度会比查完整模型对象快不少。但values_list拿不到get_status_display()这类模型方法所以需要你在导出前把 choices 的 label 映射准备好。6.3 异步导出留好扩展口如果数据量真的到了导出一次要几十秒、甚至几分钟的地步同步 HTTP 导出会让请求超时。这种情况下不要硬扛建议把导出任务丢到异步队列里比如 Celery 或简单的后台线程生成完文件后放到临时存储再给用户一个下载地址。admin 这边的代码结构其实不用大变把“筛选条件”和“导出字段配置”打包成一个任务参数异步任务里调用同样的序列化函数去生成文件。所以一开始写导出逻辑时尽量把“从查询集转成 CSV 行”的代码独立出来不要和 HttpResponse 耦合太深这样以后迁到异步任务会轻松很多。6.4 常见问题速查表我把实际开发中遇到的高频问题整理成了表格方便你出了问题直接对照。现象原因解决办法Excel 打开中文乱码没有写 UTF-8 BOM导出前response.write(\ufeff)浏览器下载文件名乱码Content-Disposition没有做编码用filename*UTF-8quote()时间列带字母 T用了isoformat()统一strftime(%Y-%m-%d %H:%M:%S)外键列全是 id直接序列化对象在导出行里显式取业务显示字段想导出筛选后全部数据没反应用了 admin action没勾选记录改造为列表页工具栏按钮导出几万行后内存暴涨HttpResponse 一次性缓存改用StreamingHttpResponse导出文件和列表页看到的数量不一致ChangeList 解析参数有遗漏检查请求参数是否包含全部筛选字段多字段拼接后列错位CSV 分隔符冲突交给csv.writer处理引号与转义不要手工拼接最后分享一个在实际项目里验证过的做法如果导出功能会长期迭代我会把“导出字段定义”和“查询集构造”拆成两个独立函数一个管“查到什么”一个管“输出成什么样”。这样不管是加字段、调权限还是以后接入异步导出都只需要改动其中一部分不会牵扯整个视图。这也是我在这个需求上踩了几次坑之后最想让你一开始就注意的事情。

相关新闻

Flutter工程规范实战:用Claude Code和Codex约束AI写代码

Flutter工程规范实战:用Claude Code和Codex约束AI写代码

最近我在几个 Flutter 项目里试了用 Claude Code 和 Codex 来写代码,效果确实惊艳,但翻车概率也一点都不低。最典型的情况是:AI 能独立完成一个小功能,却会在你根本没注意到的地方破坏既有约定——混用状态管理方案、跳过异常处理…

2026/10/19 3:17:05 阅读更多 →
YOLOv8基建裂缝检测系统:轻量高鲁棒的工程落地实践

YOLOv8基建裂缝检测系统:轻量高鲁棒的工程落地实践

1. 项目概述:为什么一个“基建裂缝检测系统”值得用YOLOv8重做一遍你可能已经见过不少用YOLO系列做裂缝识别的Demo——拍张照片,框出几条灰白细线,再打个“裂缝:0.87”的标签,就叫“智能巡检”。但真把它拉进某高铁桥墩…

2026/10/19 3:17:05 阅读更多 →
基于Python与深度学习的植物病虫害识别系统设计与实现

基于Python与深度学习的植物病虫害识别系统设计与实现

1. 项目整体设计与技术选型植物病虫害识别这几年一直是农业信息化里的热门方向,真正落地做过的朋友都知道,难点不在模型本身,而是“识别”这个动作如何被最终用户方便地使用。我这次做的这套基于Python的植物病虫害识别系统,目标很…

2026/10/19 3:17:05 阅读更多 →

最新新闻

open-code-review实战:把团队评审规范变成自动化规则引擎

open-code-review实战:把团队评审规范变成自动化规则引擎

最近接手了一个维护了两年多的老项目,团队 Review 慢慢变成了“LGTM 复读机”,CI 只查格式和单测,真正的问题全靠评审人肉眼硬扛。我试着把一个叫 open-code-review 的开源工具接进仓库,让机器人在每次 Push 和 Pull Request 上都…

2026/10/19 4:12:36 阅读更多 →
libusb同步读写全解析:从设备枚举到错误码排查

libusb同步读写全解析:从设备枚举到错误码排查

先说个我自己踩过的经历。头一回正经调USB设备读写时,我第一版就上了异步回调,中断一进来就转发数据,回调里还得维护状态机,日志一多,根本分不清哪条数据对应哪次请求,最后被一个偶发的丢包问题折腾了整整一…

2026/10/19 4:12:36 阅读更多 →
磁瓦缺陷视觉检测:多角度分时曝光与深度学习实战方案

磁瓦缺陷视觉检测:多角度分时曝光与深度学习实战方案

这一年多,凡是在永磁电机供应链里待过的人,应该都体会过一种“幸福的烦恼”:订单在涨,产线在加速,但质检工位永远在招人。这里的“磁瓦”指的就是电机里那种弧形的永磁体——铁氧体磁瓦也好,稀土磁瓦也好&a…

2026/10/19 4:12:36 阅读更多 →
open-code-review 接入实践:用增量代码审查机器人补上人工 Review 的漏

open-code-review 接入实践:用增量代码审查机器人补上人工 Review 的漏

最近线上出了一个让我印象特别深的故障:一个灰度了半小时的后台服务突然开始疯狂弹“强制更新”的窗,用户怎么点都关不掉。事后复盘根本原因,是一个布尔判断被写反了,if (forceUpdate)变成了if (!forceUpdate)。代码评审的时候&am…

2026/10/19 4:12:36 阅读更多 →
开源代码评审工具链实战:从流水线配置到团队协作

开源代码评审工具链实战:从流水线配置到团队协作

很多人对 code review 的第一印象,来自那种"已批准"按钮被无情点击的瞬间——凌晨两点,PR 挂了两天,Reviewer 匆匆瞄了一眼 diff,留下一句 LGTM,然后合并、上线、出事。我做过几年一线研发,也带过…

2026/10/19 4:12:36 阅读更多 →
基于YOLOv8与PyQt5的无人机实时检测系统实战

基于YOLOv8与PyQt5的无人机实时检测系统实战

1. 项目概述与方案选型1.1 为什么选择YOLOv8目标检测框架先聊个实质性的问题:无人机检测这个任务,市面上可选的目标检测框架很多,从早期的Faster R-CNN到SSD,再到YOLO系列的各种变体,为什么我最终锁定YOLOv8来做这个项…

2026/10/19 4:11:36 阅读更多 →

日新闻

频率跟踪型PWM电源设计:臭氧发生器谐振点漂移与软开关实现

频率跟踪型PWM电源设计:臭氧发生器谐振点漂移与软开关实现

简介:本资源为电源技术方向的学术研究文档,聚焦介质阻挡放电型臭氧发生器电源的频率跟踪型PWM控制策略,面向电力电子、高压电源及臭氧应用领域的科研人员与工程技术人员。针对负载呈容性、等效电容随外加电压升高而增大、谐振频率随之漂移的难…

2026/10/19 0:00:47 阅读更多 →
Vibe Coding 遇上 TaoToken:把开发者思维圣殿的灵感流接入统一 Key 通道

Vibe Coding 遇上 TaoToken:把开发者思维圣殿的灵感流接入统一 Key 通道

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/19 0:00:47 阅读更多 →
HundredCV-Chat话题建模实战教程:利用4,871个内置话题标签构建主题分析系统

HundredCV-Chat话题建模实战教程:利用4,871个内置话题标签构建主题分析系统

【免费下载链接】HundredCV-Chat 项目地址: https://ai.gitcode.com/hf_mirrors/Jax-dan/HundredCV-Chat 点击查看 免费下载 HundredCV-Chat 是一个由 100 位青年简历数据开发而来的中文多轮对话数据集,共包含 24,750 组日常闲聊对话和 4,871 个话题标签…

2026/10/19 0:00:47 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/19 1:30:52 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/19 2:54:50 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/17 17:22:31 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 12:16:16 阅读更多 →