
PyKeePass 中 Entry.tags 是只读属性的伪装列表,直接调用 append() 不会持久化;必须通过重新赋值 i.tags = new_tag_list 触发 setter,才能将更新后的标签写入 .kdbx 文件。
pykeepass 中 `entry.tags` 是只读属性的伪装列表,直接调用 `append()` 不会持久化;必须通过重新赋值 `i.tags = new_tag_list` 触发 setter,才能将更新后的标签写入 `.kdbx` 文件。
在 PyKeePass 中,Entry.tags 表面看是 Python 列表(如 ['test']),但其底层实现是基于属性访问器(@property + @tags.setter)的封装:
-
getter 将 KeePass 内部存储的分号分隔字符串(如
"test")解析为list; -
setter 则将传入的
list重新用分号拼接为字符串并写回 XML 结构。
因此,i.tags.append(env) 仅修改了临时生成的列表副本,并未触发 setter,导致保存后标签无变化。
✅ 正确做法是:获取当前标签列表 → 修改 → 整体重新赋值给 i.tags:
def appendTagKP(env):
kp = PyKeePass(r'D:\users\NewDatabase.kdbx', password=decodeStr(kp_password))
test_entries = kp.find_entries(tags='test', first=False)
if test_entries:
for entry in test_entries:
print(f"Title: {entry.title}")
# ✅ 安全追加:先读取、再扩展、最后整体赋值
updated_tags = entry.tags + [env] # 推荐:简洁、不可变、避免副作用
entry.tags = updated_tags
print(f"After tags edit: {entry.tags}")
print(f"Password: {entry.password}")
kp.save() # 必须显式调用 save() 才能写入磁盘
⚠️ 注意事项:
- 不要使用
i.tags.append(env)或i.tags.extend([env])—— 这些操作不触发 setter,无效; - 标签中若含空格、分号、逗号等特殊字符,PyKeePass 会自动转义,无需手动处理;
- 若需去重,建议在赋值前检查:
if env not in entry.tags: entry.tags = entry.tags + [env]; -
kp.save()不可省略,且应放在所有修改之后统一调用(提高性能,避免多次 I/O)。
? 进阶提示:你也可以用集合去重后转回有序列表(保持原始顺序):
new_tags = list(dict.fromkeys(entry.tags + [env])) # 保留顺序的去重 entry.tags = new_tags
执行后,原条目 jhr 和 jhrjhr 的标签将正确更新为 ['test', 'ACC'],并在 KeePass GUI 或下次加载时可见。










