
AnyPS5这个名字听起来像是什么硬件改造项目其实它只是我给自己PS5游戏库写的一个离线管理小工具。起因特别朴素某天我打开主机想找个游戏玩翻了半天游戏列表发现自己已经说不清库里到底有多少款游戏哪些买了还没碰过哪些玩了一半就搁置了。加上主机存储常年告急外接固态硬盘里的游戏换了又换数字版和实体盘混成一团那一刻我就知道该给这个库做一次彻底的盘点了。这篇文章就是想把AnyPS5从想法到落地的全过程写清楚为什么不用现成工具、数据模型怎么设计、脚本怎么写、跑完真实游戏库后得出了哪些反直觉的结论以及维护过程中踩过的坑。如果你也是个游戏越买越多、却越来越不知道玩什么的人这套思路可以直接抄走不需要懂什么高深技术一个CSV加一段Python脚本就够了。1. 游戏库不是凭空变乱的一个PS5玩家的真实库存现状1.1 48款游戏、1.8TB容量我却说不出库里有什么先说我的具体情况。机龄两年多平时有实体盘收藏癖又抵抗不住数字商店打折的诱惑东买西买攒下来48款PS5和PS4兼容游戏安装容量加起来大概1.8TB。听起来挺壮观但实际上有22款游戏下载安装了但一周内没打开过第二次。有10款游戏玩了几小时就弃坑进度永远停在20%左右。有3款游戏买了两个版本会免领了一份打折又买了一份。外接4TB固态硬盘装了大约30款游戏里面至少有一半我完全不记得什么时候装的。最尴尬的一次是朋友来家里想玩某款合作游戏我信誓旦旦说库里肯定有结果打开游戏库翻了两分钟都没找到最后发现买的是PS4版在你的收藏深处而且还没下载。这已经不是体验问题了这是管理混乱导致的实打实的损失。后来我想过用备忘录记、用Excel拉个表格但每次打开表格看到一堆空白列就完全没有填写的动力。我需要的不只是一个清单而是一个能回答我现在该玩什么我的存储还够装什么我这一年买游戏到底花了多少钱的工具。1.2 现成工具为什么一个都不好用市面上不是没有游戏库管理方案我几乎都试过一遍各有各的别扭PS App自带列表只能看已购买和已安装区分不了实体盘和数字版也看不出容量和状态信息维度太少。第三方网站统计站需要授权账号数据不仅要把自己的游戏记录开放给陌生服务而且更新不及时中文游戏名经常对不上。Notion/Excel模板自由度确实高但所有信息都要靠双手录入还容易越维护越乱过一个月就懒得动了。Playnite这类PC游戏库软件需要Windows环境对PS5主机游戏的支持主要靠手动建条目主要服务对象也不是主机玩家。说到底我的需求其实很朴素一个不进主机、不碰账号、不依赖网络服务的工具把游戏库当成一套可以持续维护的数据定期生成一份能指导决策的报告。市面上的方案要么太封闭要么太重量级都不够贴身。既然没有顺手的自己造一个反而是最省事的。1.3 AnyPS5的定位不进主机、不碰账号、纯本地盘点所以AnyPS5的定位就确定下来了它不是一个侵入式工具不进主机系统、不抓取账号数据只是一套我自己维护的本地游戏库数据 分析脚本。整个系统由三部分组成一份CSV文件每行一款游戏字段包括名称、载体、容量、状态、价格等。一个Python脚本负责读取CSV做统计、筛选、排序输出Markdown格式的盘点报告。一份简单的日常维护流程让每次买了游戏顺手加一行变成肌肉记忆。这个设计最大的好处是安全不联网、不授权、不把任何个人信息交给第三方数据永远在我自己的硬盘里。想换格式、加字段、写别的程序来读取都随便。它就是一张账本而脚本是账本上的计算器。2. AnyPS5的功能取舍与数据模型设计2.1 只解决三个高频问题找游戏、看容量、查状态做工具最忌讳一开始就想做全功能。AnyPS5的所有功能都围绕三个高频问题展开找游戏当我坐在沙发上想看玩什么时能按载体、状态、语言来筛快速定位候选游戏。看容量主机存储和固态硬盘还剩多少装一款新游戏会不会挤掉旧游戏这个判断必须有量化依据。查状态哪些游戏弃坑了哪些通关了哪些是想玩但还没下载一口吃不成胖子但账要算清。至于游戏评价、全成就进度、联机奖杯这些更深度的数据我没有纳入第一版。原因很简单每多一个字段维护成本就高一分而维护意愿是工具能不能长期用下去的唯一关键。一开始求多最后一定弃坑。2.2 字段怎么定既有用又要低维护成本CSV的字段设计是AnyPS5的核心决策。我最终定的字段如下每个都有明确用处字段名说明示例值name中文名我自己最熟悉的叫法战神诸神黄昏title_id游戏唯一标识通常印在实体盘封底或商店页面里CUSA-34384region区服判断DLC和语言版本是否匹配港服media载体数字版/实体盘数字版platformPS5原生还是PS4兼容PS5lang是否有中文/日文/英文中文size_gb安装容量小数单位GB92.5status状态枚举见下方已通关installed安装位置主机存储/外置SSD/未安装主机存储source购买渠道数字商店打折/首发/会免/二手购入数字商店打折price入手价按港币或人民币记录统一单位即可468date入手日期精确到月即可2024-03rating我自己的评分1-55note备注填一句话比如流程8小时适合一次通关流程紧凑status字段的枚举我定义得很克制只保留了6个值想玩列入清单但还没买或还没装未开始已买但没下载/没打开游玩中最近正在玩已通关通关主线或核心内容弃坑明确不打算继续已出掉实体盘已二手卖出注意想玩和未开始我特意分开一个是购买意向一个是已购但未推进。如果不区分报告里就分不清该不该买和该不该玩这两个问题的决策逻辑完全不同。2.3 做成命令行工具而不是网页的理由很多朋友问我为什么不顺手做个网页界面好看又方便点击。我做命令行工具是刻意为之依赖最薄只要机器上有Python 3不需要装框架、不需要数据库、不需要部署一个.py文件走天下。可维护性高命令行工具的输出是标准Markdown我可以直接粘贴到自己的笔记软件里存档也能丢进Git仓库做版本管理。门槛被劝退如果做成网页我会忍不住想去调UI、做按钮、美化样式这些和把游戏库管好的目标毫无关系。命令行丑是丑但刚好够用而且能逼我把精力留在数据本身。python anyps5.py report回车一份报告就出来了。简单直接这就是我需要的一切。3. 从零搭建AnyPS5数据收集、脚本编写与日常流程3.1 第一版CSV把商店和PS App里能看到的都当原始数据搭建的第一步是建立初始CSV。我给自己定了一条规矩第一版数据不求完美只求完整。意思是先把所有游戏都录入再说字段暂时留空也没关系后续可以慢慢补。数据来源有三个PS App的已购买列表能看数字版历史和部分容量信息适合批量核对。实体盘封底主要看title_id和区服标识这个ID在二手交易时也很有用能确认版本。商店页面详情用来确认安装容量、语言支持和PS5/PS4归属。我建议按游戏名首字母排序逐条录入一次搞不定就分三次每次录16款左右每次控制在30分钟以内。这样不会太枯燥。CSV文件用Excel或者文本编辑器都能维护。如果你用Excel记得保存时编码选UTF-8否则后面Python读中文会乱码。这个坑我踩过后面专门讲。以下是初始CSV的格式示例name,title_id,region,media,platform,lang,size_gb,status,installed,source,price,date,rating,note 战神诸神黄昏,CUSA-34384,港服,数字版,PS5,中文,92.5,已通关,主机存储,数字商店打折,468,2024-03,5,流程紧凑 最终幻想7重生,CUSA-28055,港服,数字版,PS5,中文,83.2,游玩中,外置SSD,首发,568,2024-02,4,第二章 艾尔登法环,CUSA-18521,港服,实体盘,PS5,中文,45.0,弃坑,外置SSD,二手购入,320,2023-05,3,难度没扛住3.2 核心脚本统计、筛选、生成报告的三段式实现AnyPS5的脚本我拆成了三个层次加载数据、处理数据、输出报告。每一层只做自己的事这样后续加功能特别方便。完整脚本如下可以直接存成anyps5.py使用import csv import sys from pathlib import Path from collections import Counter LIB_CSV Path(ps5_library.csv) REPORT_FILE Path(ps5_report.md) def load_library(pathLIB_CSV): 加载CSV文件返回字典列表。 if not path.exists(): raise FileNotFoundError(f找不到 {path}请先创建游戏库CSV文件。) with path.open(r, encodingutf-8-sig, newline) as f: return list(csv.DictReader(f)) def to_gb(value): 把容量字段安全转成浮点数空值当0处理。 try: return float(value) except (TypeError, ValueError): return 0.0 def summarize(items): 汇总统计总数、总容量、载体分布、状态分布。 total_gb sum(to_gb(x.get(size_gb)) for x in items) by_media Counter(x.get(media, 未知) for x in items) by_status Counter(x.get(status, 未标记) for x in items) unplayed [x for x in items if x.get(status) in (未开始, 想玩)] unplayed_gb sum(to_gb(x.get(size_gb)) for x in unplayed) return { total: len(items), total_gb: total_gb, by_media: by_media, by_status: by_status, unplayed_count: len(unplayed), unplayed_gb: unplayed_gb, } def filter_by(items, **conditions): 按字段精确筛选支持多个条件。 result items for key, value in conditions.items(): result [x for x in result if x.get(key) value] return result def top_n(items, n5, keysize_gb): 按指定字段排序取前n条。 return sorted(items, keylambda x: to_gb(x.get(key)), reverseTrue)[:n] def generate_markdown(items): 生成Markdown格式报告。 s summarize(items) lines [ # PS5游戏库盘点报告, , f- 游戏总数{s[total]}, f- 安装容量合计{s[total_gb]:.1f} GB, f- 未开始/想玩{s[unplayed_count]} 款约 {s[unplayed_gb]:.1f} GB, , ## 载体分布, , ] for media, count in s[by_media].most_common(): lines.append(f- {media}{count} 款) lines [, ## 状态分布, ] for status, count in s[by_status].most_common(): lines.append(f- {status}{count} 款) lines [, ## 容量Top 5, , | 游戏名 | 容量 | 状态 | 安装位置 |, | --- | --- | --- | --- |] for x in top_n(items): lines.append( f| {x.get(name, 未知)} | {x.get(size_gb, 0)} GB | f{x.get(status, 未知)} | {x.get(installed, 未知)} | ) return \n.join(lines) def main(): if len(sys.argv) 2: print(用法: python anyps5.py [report|filter|check]) sys.exit(1) items load_library() cmd sys.argv[1] if cmd report: REPORT_FILE.write_text(generate_markdown(items), encodingutf-8) print(f报告已生成{REPORT_FILE}) elif cmd filter: try: key, value sys.argv[2], sys.argv[3] except IndexError: print(用法: python anyps5.py filter 字段名 值) sys.exit(1) for x in filter_by(items, **{key: value}): print(f{x.get(name, 未知)} | {x.get(status, 未知)}) elif cmd check: for x in filter_by(items, status想玩): print(f想玩但还没买{x.get(name, 未知)}) else: print(未知命令支持 report / filter / check) if __name__ __main__: main()这段脚本我运行了两个月稳定性没问题。它的核心逻辑很简单summarize做统计filter_by做筛选generate_markdown拼报告。你想加新功能比如按年份统计购买金额只需要在summarize里加一段代码再在报告生成里输出即可。3.3 流水线化的日常维护每次买游戏后的3分钟录入工具有了维护流程才是它能不能长期活下去的关键。我的流程设计成三分钟原则新游戏入手后立刻录入等下载的时候顺手加一行填上名称、载体、容量、价格、日期其他字段等玩了再补。下载等待期比游戏本身更能让人坚持填数据。每周五晚上跑一次检查当周通了关、弃了坑、出了盘就把状态改掉。每周只花10分钟不会积压。每次报告出来后瞄一眼Top5容量如果几款大容量游戏全是未开始状态要么删掉给新游戏腾位置要么塞进外置硬盘吃灰。我承认中间确实有一阵子偷懒连续两周没更新CSV。结果第三周跑报告时数字明显失真连我自己都看不下去。那之后我就把脚本加了个小功能每次启动时核对CSV最后修改时间超过14天就提醒一次。别小看这点提示它治好了我和工具之间的互相遗忘。3.4 用报告驱动决策每周跑一遍游戏库自己会说话每周跑一遍报告最有意思的是看数据自己讲故事。有一回报告显示未开始想玩的容量高达890GB占全库将近一半。我才意识到我根本不是缺游戏玩是缺把游戏下下来认真玩的耐心。还有一次看到某款打折入手的游戏容量只有18GB、通关只要10小时却一直挂着未开始我当天就把它装进主机一周内通了关。那份满足感比我在商店里再扫十几款打折游戏都强。这就是我希望AnyPS5带来的价值把模糊的感觉好多游戏啊变成精确的哪款在什么状态、多少容量、值不值得现在玩剩下来的事交给数据就好了。4. 实测报告跑完48款游戏后我发现的问题4.1 数据盘点结果数字版、实体盘与状态分布把48款游戏全部录入后跑出第一份完整报告。部分结果如下分类条目数占比容量合计备注数字版3266.7%约1210GB大量会免和打折入库实体盘1633.3%约590GB基本为二手购入未开始2245.8%约890GB占总容量近一半游玩中510.4%约180GB近期在玩已通关1122.9%约270GB包括PS4时代作品弃坑/已出掉1020.8%约460GB应当尽早清仓数字版占比三分之二但真正通关的游戏里实体盘比例更高。这说明一个趋势我买的很多数字版游戏购物的那一刻就已经完成了一半的快乐后面玩不玩反倒成了次要选项。而实体盘因为要插碟、要放在手边反而更容易被认真对待。4.2 意外发现一容量焦虑其实是被装了不玩放大的我一直以为自己需要更大的主机存储甚至认真考虑过再买一块2TB的M.2固态。但数据告诉我我的72款容量Top5游戏占用了将近600GB其中有4款状态是未开始或弃坑。这意味着什么我的焦虑不是存储空间不够是装了太多不该装的东西。把四款弃坑游戏删掉瞬间多出约450GB而它们对我的实际游玩没有任何影响。从那以后我再也没动过扩容的念头把预算省下来买了一款真正想玩的游戏。4.3 意外发现二外接SSD的空间分配几乎没规划外接4TB固态硬盘听起来容量充足一查数据才知道30款游戏塞得满满当当很大一部分是顺手存的旧游戏和下完就忘的会免作品。真正高频打开的游戏一直住在主机内置存储里外接硬盘反而成了冷宫。分析之后我重新做了分配策略主机内置存储只放游玩中和下一款确定要玩的游戏最多4款。外接SSD放已通关但想保留的游戏以及体量较大、暂时不玩的游戏。未安装仅保留入库记录比如已通关的实体盘和数字版小游戏。这个策略执行两周后找一个想玩的游戏的耗时从翻三分钟降到十秒以内。4.4 意外发现三二手实体盘买卖比想象中更能平衡预算报告里还有一组数据让我特别意外录入手办的16款实体盘中有8款是从二手渠道买的平均价格比全新低35%。同时我出掉了3款已经通关的实体盘总回血金额接近600元。过去我只是大概觉得二手划算但从数据上看实体盘通关后快速出二手等于用很低的成本体验了大作。相比之下数字版买了就锁死在库里哪怕通关了也变成永远的沉默资产。这个对比彻底改变了我接下来的购买偏好能玩完就出手的3A大作优先考虑实体盘反复要玩的小体量游戏才买数字版。5. 落地过程中的坑、心得与下一步扩展5.1 中文游戏名的编码陷阱与命名不一致AnyPS5踩的第一个坑就是CSV编码。我在Windows上用Excel编辑CSV默认保存成了GBK编码Python用utf-8读取直接乱码。解决方法是读取时使用utf-8-sig编码这能自动处理带BOM头的UTF-8文件在Excel和脚本之间来回编辑也不会乱码。第二个坑是游戏名不统一。同一个游戏港服官方叫最终幻想7重生日服列表就叫ファイナルファンタジーVII リバース实体盘封底还可能有英文别名。我一开始用中文名做唯一键结果同一款游戏被录了两遍。所以字段里单独弄了一个title_id以游戏唯一ID为准名字只当显示用。这条经验对任何需要管理多语言、多渠道来源的清单类工具都适用。5.2 手工维护的懒惰曲线如何设计低门槛录入工具用得越久越会发现手工维护最大的敌人不是技术是懒惰。我的应对方法是不断降低录入成本把字段从最初的20个砍到14个把每次填完所有字段改成必填只有名称、容量、状态三个其他随意。状态更是做了别名简化也能用的设计w 想玩s 未开始p 游玩中f 已通关g 弃坑o 已出掉录入一行游戏先写名称和容量状态默认未开始喜欢的话再改。大部分操作十秒钟能搞定。事实也证明一个看起来不够严谨但足够简单的流程远比一个全字段强制填写的流程能坚持更久。5.3 后续方向OCR识别、HTML报表与统一多平台游戏库AnyPS5目前已经满足了我90%的需求不过下一步我有三个方向想尝试拍照OCR自动录入用手机拍实体盘封底自动识别游戏名和ID再把信息回填CSV。现在市面上的OCR引擎已经很成熟这个功能并不复杂能省下大量手工录入时间。生成HTML报表Markdown适合随手翻看但HTML可以做成交互视图按状态、载体、区服点击筛选方便在手机和平板上查看。统一多平台游戏库除了PS5我还有Switch卡带和Steam库存。如果把这套CSV的思路扩展成多表联合用名称作为关联键就能得到一个全平台的游戏账本。到时候想回答我在每个平台花了多少钱哪个平台积压最严重就都是几分钟的事。除此之外我还考虑过把CSV同步到Git仓库每次维护后提交一次这样能看到游戏库一年来的演变轨迹。每当年底想复盘自己买了多少游戏、通关了多少时回头看Git提交历史比任何年终报告都直观。如果你也想给游戏库做一次盘点我的建议是从很小的起点出发先把游戏名列进CSV再逐步补字段。工具能帮你统计但真正让数字产生价值的是每一次买游戏时顺手录入的那一分钟。对我来说AnyPS5帮我省下的不只是几百GB空间更是一笔笔被冲动消费掩盖的沉默成本。现在每次打开商店看到打折我会先打开报告看一眼未开始那一栏——数据摆在那里该不该买你自己看着办。