跨平台文件自动化处理工具rea:Python实现与踩坑解析
之前处理一批零散文件的时候我顺手整理了一个内部的小工具代号就叫“rea”。说白了就是“Rapid Execution Automation”的缩写目标很朴素把跨平台环境下那堆重复性的文件整理、批量重命名、格式转换、归档打包的活儿用一套脚本统一干完。后来这工具在公司里传开不少同事都在用我才意识到这类需求比想象中普遍得多。今天就把rea的设计思路、核心代码和踩坑记录完整拆开讲一遍希望对正在折腾同类自动化脚本的人有帮助。1. 项目定位与整体设计思路拆解1.1 为什么是“rea”而不是“自动整理脚本”最初的需求其实很简单当时手头有一批从三台不同设备上汇总过来的文件命名混乱、散落在十几个子目录里有图片、有文档、有压缩包还要按项目阶段重新归档、统一命名、顺带压缩一份备份。这类活如果用鼠标手工做半小时起步如果每个场景单独写脚本维护成本又高得离谱。所以rea的定位从一开始就不是“某个一次性脚本”而是一套能覆盖常见批量处理场景的跨平台命令行工具。这背后有个关键认知文件处理类的自动化最大的成本不是写代码而是“识别边界”。你永远不知道用户的文件命名有多离谱、目录层级有多深、文件类型有多杂。所以rea在设计上刻意收敛了功能边界——不追求覆盖所有需求只做五个高频动作扫描scan、重命名rename、归档archive、转换convert、报告report。每个动作都是独立子命令互相不耦合这样既能单独用也能串成流水线。1.2 为什么选Python而不是Shell或Node这个话题我被人问过很多次。如果只在Linux服务器上跑Shell脚本确实够用但一旦涉及Windows和macOSShell的跨平台性立刻变成灾难——PowerShell和Bash的语法差异、路径分隔符、编码规则都不一样同一套逻辑要写两遍。Node.js也是个选择但Node处理文件时对编码和路径的细节处理不如Python标准库那么顺手。Python最打动我的一点是它的标准库已经覆盖了绝大部分文件处理需求pathlib统一处理跨平台路径zipfile做压缩打包concurrent.futures做并发logging做日志argparse做命令行解析——全程不需要装任何第三方依赖。对于公司内部分发工具的场景这太重要了同事拿到脚本后不需要先配环境装依赖只要机器上有Python 3.8就能直接跑。这一点在后续推广时省了无数“为什么我跑不起来”的答疑时间。1.3 整体架构与功能边界rea的架构不复杂但我在模块划分上花过心思。所有功能分成三层底层是core负责路径解析、文件遍历、编码检测、日志输出这些基础设施中间层是actions对应scan/rename/archive/convert/report五个动作每个动作只依赖core不依赖其他动作最上层是cli用argparse把五个动作暴露成命令行子命令统一参数风格。这种三层结构的好处是后期往里加新动作比如dedup去重时只需要在actions下新增一个模块再在cli里注册一下即可完全不需要动其他代码。对于一个会持续演进的工具来说这一点很重要。功能边界上rea明确不做几件事不处理文件内容级修改除非是明确的格式转换指令、不做GUI、不做后台服务。它的定位就是“一次一条命令干完就退出”的批处理工具保持简单和可预测。2. 核心技术点拆解与实现要点2.1 路径与跨平台处理的三大暗坑文件处理工具最容易被低估的就是路径问题。我用pathlib替换了所有字符串形式的路径拼接原因很直接pathlib.Path在Windows上自动用反斜杠在Linux和macOS上自动用正斜杠不需要自己判断os.sep。但仅仅换到pathlib还不够实际运行中还会踩到三个更隐蔽的暗坑。第一个是Windows的网络路径UNC路径形如\\server\share\folder。pathlib虽然能表示UNC路径但某些操作如relative_to在UNC路径下表现异常。我的处理原则是统一用Path.resolve()先解析成绝对路径再做后续操作。第二个是macOS下的Unicode规范化问题。macOS的文件系统默认使用NFD分解形式存储文件名而Windows和Linux通常用NFC合成形式。如果同一个文件名在两台设备间传过字符看起来一模一样但字节序列不同导致脚本判断相等性时出错。我的解决办法是在扫描阶段统一对文件名做一次NFC规范化unicodedata.normalize(NFC, name)。第三个是路径长度。Windows默认路径上限是260个字符虽然新版Windows可以通过注册表开启长路径支持但你不能要求每台用户机器都改注册表。rea的应对策略是操作前检查路径长度超过限制时记录到警告日志并跳过而不是让整个任务崩溃。2.2 编码检测与文件名乱码处理批量处理文件时乱码问题几乎是必然遇到的尤其是从压缩包或旧设备里解压出来的文件文件名编码经常是GBK甚至其他非标准编码。Python在Windows上读取文件名时用的是系统默认编码如果文件名的编码和系统默认不一致直接os.listdir就可能抛出UnicodeDecodeError。rea的做法是分层处理遍历阶段用os.scandir而非os.listdir因为scandir在Windows上对非法编码的处理更宽容读取到可能的乱码名称后尝试用常见编码组合解码utf-8→gbk→big5→shift_jis哪个能解码成功就用哪个。这一步不能保证100%还原但实际效果已经足够好——在测试中能恢复约95%的乱码文件名。2.3 并发处理的性能策略与GIL边界文件整理任务大多是IO密集型压缩、拷贝、格式转换都卡在磁盘和CPU的外部等待上。对于这类任务Python的GIL影响不大因为线程在等待IO时会主动释放GIL。所以rea在处理批量文件时用concurrent.futures.ThreadPoolExecutor做主并发方案默认线程数为min(32, os.cpu_count() 4)可以用--workers参数覆盖。有意思的是并发数并不是越大越好。我实测过在机械硬盘上跑批量压缩时并发数调到16以后吞吐量不再上升反而略微下降——因为磁盘寻道时间成了瓶颈大量线程在排队等同一块磁盘。在NVMe SSD上这个阈值会高很多但默认值仍然设为32以内比较稳妥。对于网络磁盘NAS并发数反而要调低到4~6否则NAS的连接数会先被打满。2.4 干跑模式与失败恢复机制这是rea我最得意的设计之一所有修改类动作rename、archive、convert都支持--dry-run参数。干跑模式下脚本只打印“将要做什么”不实际执行任何修改。原因很简单文件操作是不可逆的尤其重命名一旦执行错了要恢复就得反向再跑一遍非常痛苦。在rea里--dry-run不仅打印计划动作还会统计“将处理多少文件、将释放多少空间、是否检测到冲突”。比如重命名时发现目标文件名已存在干跑模式就会直接标红显示冲突提示用户修改规则。另一个机制是失败清单。rea在正式执行时每个动作的错误不会中断整个流程而是被捕获后写入failures.log。跑完全部任务后会汇总报告显示“成功多少、失败多少、失败原因分布”。这意味着你可以放心把rea跑在一个几千文件的大目录上中途遇到几个磁盘错误、权限问题任务不会停摆最后看日志按图索骥处理即可。2.5 日志系统的双通道设计日志我用了两套出口终端只显示进度和严重错误详细日志写文件。原因是实际使用中终端输出不重要用户只需要知道“跑得多快、有没有出大事”而排查问题时需要的是完整记录每条文件操作的前因后果。高级别的INFO日志记录每个文件的操作结果格式为时间 | 动作 | 源路径 | 目标路径 | 状态DEBUG日志则记录路径解析参数、编码检测过程等内部细节。排查问题时打开文件日志基本能还原整个执行过程。3. 实操过程与核心环节实现3.1 环境准备与项目初始化只要机器有Python 3.8就能跑不需要建虚拟环境也不需要pip install任何东西。Windows用户直接用py命令macOS和Linux用python3。我建议把整个项目保持单文件结构方便分发rea/ rea.py # 主入口解析命令行 core.py # 路径、编码、日志等基础功能 actions/ scan.py rename.py archive.py convert.py report.py之所以用模块文件而非单文件是因为单文件超过800行后后续维护和调试会变得烦躁。分模块后每个文件控制在一两百行逻辑清爽。3.2 扫描模块的实现扫描是其他所有动作的基础。rea的scan动作本质上是一个增强版的os.walk但额外收集了文件大小、修改时间、类型分类、编码信息输出JSON或CSV格式的报告。核心代码# actions/scan.py from pathlib import Path import json, os, unicodedata def collect_files(root: Path, extsNone): root Path(root).resolve() results [] for dirpath, dirnames, filenames in os.walk(root): for name in filenames: full_path Path(dirpath) / name # 跳过隐藏文件以.开头可通过参数控制保留 if name.startswith(.) and not include_hidden: continue # 统一Unicode编码形式避免跨设备复制后文件名比对失败 norm_name unicodedata.normalize(NFC, name) entry { path: str(full_path), name: norm_name, suffix: full_path.suffix.lower(), size: full_path.stat().st_size, mtime: full_path.stat().st_mtime, } results.append(entry) return results注意这里我用os.walk而非Path.rglob原因是rglob在目录树特别深的时候性能稍差且无法方便地跳过隐藏目录如.git。使用os.walk可以在遍历时直接修改dirnames列表来剪枝比如dirnames[:] [d for d in dirnames if not d.startswith(.)]。3.3 重命名模块与规则引擎重命名是最容易出错的动作所以rea采用“模板变量”的规则方式而不是让用户写完整的目标名。支持以下内置变量{name}原文件名不含扩展名{ext}原扩展名含点{date}修改日期%Y%m%d格式{seq}四位序号{parent}上一级目录名示例规则{date}_{parent}_{name}_v{seq}{ext}会把report.pdf修改日期2025-03-18位于projectA下重命名为20250318_projectA_report_v0001.pdf。核心逻辑# actions/rename.py import re, unicodedata from pathlib import Path from datetime import datetime def apply_template(entry, template, index): vars_map { name: Path(entry[path]).stem, ext: Path(entry[path]).suffix, date: datetime.fromtimestamp(entry[mtime]).strftime(%Y%m%d), seq: f{index:04d}, parent: Path(entry[path]).parent.name, } new_name template.format_map(vars_map) return unicodedata.normalize(NFC, new_name)模板执行前我会做一次冲突预检把同目录下所有目标文件名放在一个集合里检查重复一旦发现重复直接终止并提示用户修改规则。这个预检可能是我实际使用中避免最大灾难的功能——曾经一次性重命名300个文件时遇到过目标名重复没有预检的话会把文件互相覆盖掉。3.4 并发压缩与格式转换的取舍archive动作负责把一批文件按目录打包成zip。这里有一个取舍Python的zipfile单文件压缩模式和历史悠久的zip命令行工具相比速度偏慢但它跨平台一致、不依赖外部程序。并发压缩的实现值得说一下# actions/archive.py from concurrent.futures import ThreadPoolExecutor, as_completed import zipfile def pack_one(args): file_path, zip_writer, arcname args try: zip_writer.write(file_path, arcnamearcname) return True, arcname except Exception as exc: return False, f{arcname}: {exc}每个线程持有同一个zipfile.ZipFile对象的引用ZipFile.write内部是有锁保护的所以并发写同一个zip是安全的。这一点在标准库文档里没有明确说但实测表明Python的zipfile写入操作是线程安全的可以放心用。压缩等级默认设为ZIP_DEFLATED压缩级别选6。这个级别是压缩率和速度的平衡点级别9虽然压缩率高一点但耗时是级别6的两到三倍级别0不压缩只打包适用于已经压缩过的文件jpg、mp4等。convert动作目前只支持两类转换Office文档互转通过调用本机安装的办公软件命令行和图片格式转换需要Pillow库。对于不想依赖第三方的场景convert --type会提示你改用archive方案打包而不做内部转换。这个设计很务实——格式转换极易受版本和编码影响把它做成“尽力而为”的附加功能而不是核心卖点。3.5 报告生成与结果可视化report动作会在任务执行结束后生成一个summary.txt和summary.json。内容包含扫描文件总数与总大小按扩展名统计的文件类型分布各动作的成功/失败/跳过数量失败样例前20条执行耗时按秒这个报告在生产环境价值很大。有一次同事拿rea跑完2400个文件的归档跑完后靠报告里的类型分布分布发现还有一批.tmp临时文件没清理等于白捡了一轮显性收益。生成JSON报告的核心代码# actions/report.py import json def write_report(stats, output_dir): summary { files_total: stats[total], size_total: stats[size], by_extension: stats[ext_counter], success: stats[success], failed: stats[failed], skipped: stats[skipped], elapsed_seconds: round(stats[elapsed], 2), fail_samples: stats[fail_samples][:20], } out_path Path(output_dir) / summary.json out_path.write_text(json.dumps(summary, ensure_asciiFalse, indent2), encodingutf-8)3.6 命令行入口与典型使用场景所有模块通过一个统一的命令行入口调用。核心参数python rea.py scan /path/to/dir -o inventory.json python rea.py rename /path/to/dir --template {date}_{name}{ext} --dry-run python rea.py archive /path/to/dir --output backup.zip --workers 16 python rea.py report /path/to/summary.json三个真实场景示例场景一把/data/photos下按拍摄日期归档为yyyy/mm/目录python rea.py archive /data/photos --move --output /data/photos_archive这里--move参数会拷贝成功后删除源文件实现“归档”语义。不加--move则保留源文件实现“备份”语义。场景二批量给导出文件追加日期和序号python rea.py rename ./export --template {name}_{date}_{seq}{ext}场景三把一堆模板文件打包发给外包同事python rea.py archive ./templates --output templates_20250318.zip --format zip4. 常见问题与排查技巧实录4.1 文件被占用导致操作失败Windows上最常见的是目标文件正被Excel、Word或图片查看器占用rename和archive都会失败。现象是抛PermissionError。rea的默认策略是失败后重试两次等待间隔分别为0.5秒和2秒仍然失败就写入失败清单。我实际用下来重试机制能解决约一半的临时占用问题。但如果某个文件被Office套件持续锁住比如正在编辑中重试多少次都没用这时日志里的失败原因会准确提示“该文件可能正被其他程序占用”比直接抛一个晦涩的异常友好得多。4.2 中文文件名乱码与编码检测失败率前面提到rea内置了编码检测逻辑但检测不是万能的。有一个特例当文件名编码被双重转换过比如GBK被错误解码成Latin-1后再存盘单层检测就无法还原。这种情况下实际是无解的因为原始字节已经丢失任何算法都不能凭空还原信息。我通常在项目文档里建议用户如果是自己公司的文件流尽量保证全程用同一台Windows机器生成和解压避免文件在Linux和Windows之间反复倒手。跨设备传输时优先打包成zip而不是裸文件传输可以极大降低文件名乱码概率。4.3 Windows路径过长与260字符限制虽然现代Windows 10/11支持长路径但需要在「设置 → 系统 → 高级系统设置 → 环境变量」里启用LongPathsEnabled并且要求软件本身也支持长路径。Python 3.6在启用系统开关后是可以支持长路径的。rea的处理是双保险主动检测路径长度超过240字符时留20个字符余量给目标文件名记一条WARNING如果开启长路径开关real会正常执行否则跳过并记录原因。这里特别提一句很多第三方压缩软件创建的深层嵌套目录很容易让路径超过260解压时用--flat参数展平目录结构是一个很好的规避手段。4.4 大目录扫描慢与性能瓶颈定位第一次在几万文件的目录上跑rea时扫描耗时超出预期。后来用cProfile定位发现瓶颈不在os.walk本身而是我在循环里对每个文件执行了Path.stat()来获取mtime。stat()调用在Windows上特别慢因为它要额外打开文件句柄做元数据查询。优化方案是改用os.scandir()——它在遍历目录时直接返回包含stat信息的DirEntry对象不需要额外调用。改造后扫描速度提升了近三倍。所以rea的core层默认使用os.scandir只有在需要递归遍历时才用os.walk配合followlinksFalse。4.5 干跑模式不彻底导致的心理落差很多人第一次用--dry-run时觉得输出太少、不够直观然后跳过干跑直接正式执行。这其实是没理解干跑的价值。我建议至少跑两遍干跑第一遍用默认参数看全局计划第二遍带--verbose看每个文件的前后对比。只有当两遍的输出都符合预期时才移除--dry-run正式执行。有一次我处理公司内部的培训资料归档如果只跑一遍干跑很可能漏掉“某些文件名中带日期空格导致模板解析错误”的情况。第二遍--verbose就暴露了一处模板解析警告及时修正规则后正式执行才一次通过。这个过程多花两分钟但避免了误操作后的恢复成本。5. 扩展思路与二次开发建议rea当前版本已经稳定跑了大半年我在考虑加入两个新能力。一个是dedup去重子命令——通过文件哈希识别重复文件由于计算哈希本身就是IO密集任务正好复用现有的并发架构。另一个是watch监听模式用watchdog库监测目录变化实现“新文件落目录后自动套用规则处理”的流水线效果。这两个方向都不难关键还是守住“单文件工具、零依赖、跨平台”的定位。如果你也想照着rea的思路写自己的文件处理工具我最诚恳的建议只有一条先写干跑模式再写真执行。几乎所有文件操作类的翻车事故都可以靠“先看计划再动手”这个习惯避免。工具再强也只是辅助真正可靠的是操作前多想一遍、操作后多查一步。rea的价值不在于代码多炫而在于它把“先想清楚再行动”这件事固化成流程让你每次批处理前都有机会悬崖勒马。

相关新闻

OpenClaw 最新必安装 10 个 Skills:从 ClawHub 到 TaoToken 的完整配置清单

OpenClaw 最新必安装 10 个 Skills:从 ClawHub 到 TaoToken 的完整配置清单

/* 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 7:58:10 阅读更多 →
AI运维工作台实战:拓扑自动发现与受控配置下发

AI运维工作台实战:拓扑自动发现与受控配置下发

干网工这行最磨人的,不是设备本身有多复杂,而是那些重复得让人麻木的活儿:拓扑图过期了没人更新,新设备上线得手动画线;批量改配置的时候,一台台 SSH 上去敲命令,敲完还得再核对一遍&#xff1b…

2026/10/18 7:58:10 阅读更多 →
魔术索引三种解法:暴力、二分与跳步优化详解

魔术索引三种解法:暴力、二分与跳步优化详解

准备拿下面试官:魔术索引的三种解法与现场拆解魔术索引这道题,在《程序员面试金典》里排在第0803位,属于数组类的经典问题。我第一次遇到它是在准备实习面试的时候,当时看题目觉得简单,拿笔一写才发现自己掉进了二分查…

2026/10/18 7:58:10 阅读更多 →

最新新闻

Excel函数九大模块导航:从基础引用到动态数组的完整学习路线

Excel函数九大模块导航:从基础引用到动态数组的完整学习路线

日常跟Excel打交道的人,应该都有过这种经历:遇到一个数据问题,明明知道有函数能解决,但就是想不起来叫什么名字。更常见的是VLOOKUP用到了第三参数返回错误,SUMIFS写条件范围时把求和区域放错位置,或者一个…

2026/10/19 2:43:50 阅读更多 →
AI改造求职全链路:告别海投零面试,实现精准匹配

AI改造求职全链路:告别海投零面试,实现精准匹配

求职这件事,这两年越来越像一场“玄学”。我见过不少背景不错的候选人,学历、经验、项目都拿得出手,却卡在了一个极其尴尬的环节:简历投出去石沉大海,面试邀约寥寥无几,甚至出现“投100份简历0面试”的荒唐…

2026/10/19 2:43:50 阅读更多 →
Linux uniq命令详解:从sort配合到日志去重实战

Linux uniq命令详解:从sort配合到日志去重实战

1. 先搞清楚uniq到底在做什么用Linux的人迟早都会遇到uniq,但很多人第一次用它的经历都不太愉快——明明是想把重复行去掉,结果文件一模一样,一行都没少。这不是uniq没干活,而是它天生就是个“挑食”的工具:uniq只处理…

2026/10/19 2:43:50 阅读更多 →
模块化函数调用异常中断的上下文恢复思路与实战

模块化函数调用异常中断的上下文恢复思路与实战

模块化函数调用异常中断后的上下文恢复问题模块化架构是当前复杂系统设计的标配,但当某个函数在调用过程中异常中断,整个链路的上下文信息往往会跟着丢失。我最近在重构一套“检测-决策-执行”三段式系统时,就被这个问题反复摩擦。表面上看&a…

2026/10/19 2:43:50 阅读更多 →
Python爬虫与朴素贝叶斯:电商评论情感分析实战链路解析

Python爬虫与朴素贝叶斯:电商评论情感分析实战链路解析

简介:基于Python的京东商品评论爬取与情感分析可视化研究资源包,面向数据分析、自然语言处理与爬虫开发的初学者或课程研究者,完整演示了从电商平台采集用户评论、清洗整理、情感分类到图表可视化的处理链路。资源共20个文件,压缩…

2026/10/19 2:43:50 阅读更多 →
手把手教你制作每日AI研究简报:信息筛选与追踪方法

手把手教你制作每日AI研究简报:信息筛选与追踪方法

经常看到有人问:AI 领域更新这么快,一天不看是不是就跟不上了?我的回答是,确实会跟不上,但没人能把一天内所有论文和动态都看完,所以才需要“每日 AI 研究简报”这种东西来兜底。2026 年 3 月 28 号这一期&…

2026/10/19 2:42:49 阅读更多 →

日新闻

频率跟踪型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/18 0:55:02 阅读更多 →
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 阅读更多 →