You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

定制rdflib库serialize方法的Turtle格式输出

定制rdflib生成的Turtle文件格式

要实现你需要的三项格式调整,可以结合rdflib序列化参数和文本后处理来完成,以下是具体实现方案:

完整代码示例

import rdflib

g = rdflib.Graph()

# 添加目标三元组
g.add((rdflib.URIRef('http://example.org/my_subject_1'),
       rdflib.URIRef('http://example.org/my_predicate_1'),
       rdflib.URIRef('http://example.org/my_object_1')))
g.add((rdflib.URIRef('http://example.org/my_subject_1'),
       rdflib.URIRef('http://example.org/my_predicate_2'),
       rdflib.URIRef('http://example.org/my_object_1')))

# 生成基础Turtle内容,配置缩进和分行规则
turtle_content = g.serialize(
    format='turtle',
    indent=2,
    separate_predicate_lines=True
).decode('utf-8')

# 移除分号、句号前的多余空格
processed_content = turtle_content.replace(' .', '.').replace(' ;', ';')

# 写入文件
with open('output.txt', 'w', encoding='utf-8') as f:
    f.write(processed_content)

各需求点的实现说明

  1. 主语单独占一行:使用separate_predicate_lines=True参数(rdflib 6.0及以上版本支持),强制序列化器将主语与后续的谓词-对象对分行显示。
  2. 缩进改为2个空格:通过indent=2直接设置谓词-对象对的缩进量,替代默认的4个空格。
  3. 移除对象后的多余空格:通过字符串替换操作,把 ;改为;、 .改为.,同时处理@prefix行末尾的空格。

兼容旧版rdflib的方案

如果你的rdflib版本低于6.0,不支持separate_predicate_lines参数,可以用正则表达式补充分行处理:

import re

# 先生成默认格式的Turtle内容
turtle_content = g.serialize(format='turtle').decode('utf-8')

# 1. 拆分主语与第一个谓词-对象对
processed_content = re.sub(
    r'^(\S+) (\S+ \S+ [;.])',
    r'\1\n  \2',
    turtle_content,
    flags=re.MULTILINE
)

# 2. 把默认4空格缩进替换为2空格
processed_content = processed_content.replace('    ', '  ')

# 3. 移除分号、句号前的空格
processed_content = processed_content.replace(' .', '.').replace(' ;', ';')

# 写入文件
with open('output.txt', 'w', encoding='utf-8') as f:
    f.write(processed_content)

执行代码后生成的output.txt将完全符合你需要的格式:

@prefix ns1: <http://example.org/>.

ns1:my_subject_1
  ns1:my_predicate_1 ns1:my_object_1;
  ns1:my_predicate_2 ns1:my_object_1.

内容的提问来源于stack exchange,提问作者Rodrigo Morales

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 16:06:28