python中使用RDFlib的容错RDF解析

python中使用RDFlib的容错RDF解析,python,parsing,namespaces,rdflib,Python,Parsing,Namespaces,Rdflib,我正在写一段代码,收集一些关于本体论的统计数据。作为输入,我有一个包含文件的文件夹,有些是RDF/XML,有些是turtle或nt。 我的问题是,当我试图用错误的格式解析一个文件时,下次即使我用正确的格式解析它也会失败。 这里的测试文件是海龟格式的。如果首先用海龟格式解析它,一切都很好。但是如果我首先用错误的格式1解析它。错误是可以理解的(file:///test:1:0: 格式不正确(无效令牌)),但第二个错误为(未知命名空间前缀:owl)。就像我第一次用正确的语法解析时说的,我没有得到名称空

我正在写一段代码,收集一些关于本体论的统计数据。作为输入,我有一个包含文件的文件夹,有些是RDF/XML,有些是turtle或nt。 我的问题是,当我试图用错误的格式解析一个文件时,下次即使我用正确的格式解析它也会失败。 这里的测试文件是海龟格式的。如果首先用海龟格式解析它,一切都很好。但是如果我首先用错误的格式1解析它。错误是可以理解的(file:///test:1:0: 格式不正确(无效令牌)),但第二个错误为(未知命名空间前缀:owl)。就像我第一次用正确的语法解析时说的,我没有得到名称空间错误

求求你,两天后,我绝望了

query = 'SELECT DISTINCT ?s ?o WHERE {  ?s ?p owl:Ontology .   ?s  rdfs:comment  ?o}'
data = open("test", "r")
g = rdflib.Graph("IOMemory")

try:
    result = g.parse(file=data,format="xml")
    relations = g.query(query)
    print(( " graph has %s statements." % len(g)))
except:
    print "bad1"
    e = sys.exc_info()[1]
    print e

try:
    result = g.parse(file=data,format="turtle")
    relations = g.query(query)
    print(( " graph has %s statements." % len(g)))
except :
    print "bad2"
    e = sys.exc_info()[1]
    print e

问题是
g.parse
首先从
数据的文件输入流中读取一些部分,然后才发现它不是xml。第二个调用(使用海龟格式)在上一次尝试停止的部分之后继续从输入流读取。第一个解析器读取的部分丢失给第二个解析器

如果您的测试文件很小,xml解析器可能已经全部读取了它,剩下的部分是“空的”。海龟解析器似乎没有抱怨,只是什么也没读。只有下一条语句中的查询未能在其中找到任何类似于owl的内容,因为图是空的。(我必须承认我不能复制这一部分,在我的情况下,海龟解析器确实会抱怨,但也许我有一个不同版本的
rdflib

要修复它,请尝试重新打开该文件;重新组织代码,以便每次调用
result=g.parse(file=data,format=“(some format)”)
时都有一个
data=open(“test”,“r”)
,或者在
中调用
data.seek(0)
,例如:

for format in 'xml','turtle':
  try:
    print 'reading', format
    result = g.parse(data, format=format)
    print 'success'
    break
  except Exception:
    print 'failed'
    data.seek(0)

谢谢,这很有效!实际上,对我来说,添加
数据就足够了。seek(0)
如果有人想重现我的错误,我就用它作为测试文件。我的RDFlib版本是4.2.0。