Watch at Ease看见世界,读懂生活。

科技 · 实用指南

将 digiKam 已选照片 XML 清单转成 CSV,保留完整路径

把每条显示 URL 和重复文件名保留为表格快照,不复制照片,也不把选择清单当作导出成功证明。

区分保存选择清单与实际照片传输的原创示意图
原创示意图:保存清单和复制照片是不同步骤,清单不证明交付完成。 Watch at Ease

需要 digiKam 已选照片的表格时,直接列文件夹并不是同一个结果:它可能包含未选文件,也丢失刚做的选择。导出工具里的“保存清单”可以得到 XML 选择快照。

以下离线转换把完整的显示 URL 及其顺序保留为两列 CSV。它不复制照片、不查询数据库、不保存全部照片元数据,也不证明之后的照片导出成功。

保存工具清单,不启动照片导出

先选目标照片,再打开“导出 > 导出到本地存储”。当前手册说明窗口初始包含图标视图中已选项目。核对窗口实际清单与数量:筛选、分组、新增项目或过期选择都可能使它与预期不同。

若文件清单下方有“保存清单”控件,保存为新的本地 selection.xml。原用户讨论记录了此控件,当前完整保存函数写入 Images 根节点与带 url 属性的 Image 项目。你的版本若无此控件或格式不同,就停止,不把任意 XML 当成同一清单。我们未运行当前 digiKam 界面。

只要清单时,关闭窗口,不启动照片传输。本地导出可以复制、链接、调整大小或改变导出元数据,这些是另一步。保留原 XML,另记 digiKam 版本、选择用途、时间和清单数量。离线转换不需要修改原照片或数据库。

转换自己生成的 UTF-8 XML 副本

只使用自己保存的清单,不使用他人提供的 XML。安装 Python 3 后,在 Linux Bash 终端进入 selection.xml 所在目录,把下一命令复制为一行,保留直引号与反斜杠。选择新 CSV 名;已存在的输出会被拒绝。

python3 -c "exec('import csv\\nimport pathlib\\nimport sys\\nimport xml.etree.ElementTree as ET\\n\\nraw = pathlib.Path(sys.argv[1]).read_text(encoding=\"utf-8-sig\")\\nif \"<!DOCTYPE\" in raw.upper():\\n raise ValueError(\"Use only your own saved list without a DOCTYPE\")\\nroot = ET.fromstring(raw)\\nitems = root.findall(\"Image\")\\nif root.tag != \"Images\" or not items or len(list(root.iter(\"Image\"))) != len(items):\\n raise ValueError(\"Expected Images with direct Image entries, not nested images\")\\nurls = [item.get(\"url\") for item in items]\\nif any(not isinstance(url, str) or not url for url in urls):\\n raise ValueError(\"Every Image must have a nonempty url\")\\nwith open(sys.argv[2], \"x\", encoding=\"utf-8-sig\", newline=\"\") as destination:\\n writer = csv.writer(destination)\\n writer.writerow([\"ordinal\", \"url_display\"])\\n writer.writerows(enumerate(urls, 1))\\nwith open(sys.argv[2], encoding=\"utf-8-sig\", newline=\"\") as output:\\n parsed = list(csv.reader(output))\\nif parsed != [[\"ordinal\", \"url_display\"]] + [[str(i), url] for i, url in enumerate(urls, 1)]:\\n raise ValueError(\"Output did not round-trip: discard it and use a new output name\")\\nprint(len(urls), \"selection records exported and read back; not an export receipt\")\\n')" "selection.xml" "selection.csv"

两列为 ordinal 与 url_display。ordinal 从 1 开始按 XML 项目顺序编号,是快照行标识,不是 digiKam 数据库图片 ID。创建输出前验证 Images 根节点、直属 Image 项目及每条非空 url;拒绝嵌套 Image 或 DOCTYPE。插件设置和项目额外属性故意不导出,所以保留 XML。

保留 URL 原文本并核对行

digiKam 写入 QUrl 的显示形式。XML 解析只把 &amp; 等标记转回属性文本一次,然后不拆路径、不解码百分号序列、不修剪也不去重。显示 URL 不会自动成为本机路径或命令,不要把单元格粘贴进复制、改名或删除文件的命令。

不同目录中的相同文件名仍是独立完整 URL,完全重复的 URL 也保留独立记录。命令回读 CSV,逐条比对序号和 URL 后才打印成功。对照保存时工具清单数量,并检查多个完整 URL,尤其不同目录里的同名文件。这能验证已存记录的转换,不能发现最初漏选照片。

在 LibreOffice Calc 选择 UTF-8、逗号分隔和直双引号文本分隔符。关闭“合并分隔符”“修剪空格”“计算公式”,两列都设“文本”。窗口未出现时,打开时启用“编辑筛选器设置”。另用副本排序筛选,保留未改 CSV 主副本。

处理错误,区分选择与交付证据

XML 格式错误、根节点错误、空清单、缺失 URL 或嵌套 Image 会在创建输出前停止。目标已存在就换新名;写入或回读失败时,弃用不完整 CSV,换新名重跑。磁盘上出现文件不代表成功。HTML 图库说明或数据库导出等其他 XML 不适用。

我们实际用这条准确 Linux Bash 命令执行 13 项模拟案例,覆盖 Unicode、逗号引号、重复名称及 URL、原百分号序列、Windows/网络 URL 文本、错误输入和故意略去插件数据。五项有效双记录案例还分别验证二次写入被拒绝且输出不变。未运行 digiKam、Qt 或 Calc,也未在 Windows/macOS 执行命令。

保存清单只记录当时已选项目。确认实际交付还需另查导出结果及目标文件;这个 CSV 没有成功状态或哈希。需要可重复使用的图库选择时,已有标签与标记仍是可用办法。需要完整标题、评分等元数据时,改用相应元数据或数据库流程,不假设两列快照包含这些内容。

在两个不同完整 URL 中保留同名文件的原创示意图
原创示意图:两个模拟 IMG.jpg 名称因完整 URL 不同,仍保留为两条记录。 Watch at Ease