在 Python 中写入从 SPARQL 查询返回的 JSON 数据的正确方法
Correct way to write JSON data returned from a SPARQL query in Python
我正在使用 python3 进行 SPARQL 查询。我需要读取 Virtuoso 数据库并输出三元组。三元组中的某些数据包含换行符等特殊字符。
反正我可以这样把数据拿出来:
queryString = "some query"
sparql.setQuery(queryString)
sparql.setReturnFormat(JSON)
try:
jsonData = sparql.query()
for result in jsonData:
print('Result: ***')
f.write(str(result) + '\n')
except:
print("Oops:", sys.exc_info()[0], file=sys.stderr)
执行此操作时,我在文件中得到以下输出:
b'{\n'
b' "head" : {\n'
b' "vars" : [\n'
b' "subject",\n'
b' "predicate",\n'
b' "object"\n'
b' ]\n'
b' },\n'
b' "results" : {\n'
b' "bindings" : [\n'
b' {\n'
b' "predicate" : {\n'
b' "type" : "uri",\n'
b' "value" : "http://www.w3.org/1999/02/22-rdf-syntax-ns#type"\n'
b' },\n'
b' "subject" : {\n'
b' "type" : "uri",\n'
b' "value" : "http://www.ontologyrepository.com/CommonCoreOntologies/delimits"\n'
b' },\n'
b' "object" : {\n'
b' "type" : "uri",\n'
b' "value" : "http://www.w3.org/2002/07/owl#InverseFunctionalProperty"\n'
b' }\n'
b' },\n'
等等。我不确定 b
前缀在这些行中的作用。无论如何,我在使用 JSON 库读取它时遇到了问题。所以我更喜欢写成JSON。
我想用
这样简单的东西替换 for 循环
json.dump(jsonData, f)
或
json.dumps(jsonData, f)
当我这样做时,我收到错误消息 Oops: <class 'TypeError'>
。
我注意到 jsonData
的类型是 <class 'SPARQLWrapper.Wrapper.QueryResult'>
.
SPARQL 查询是否未返回 JSON?我还需要进行其他转换吗?
String 前面的 b 表示您的 String 不是字符串而是字节串,并且您的字节被解释为打印字符。 Look here for more information
下次如果您告诉我们更多您的问题会更容易。您使用的是什么库、哪个版本、示例查询等。
在您的情况下,我假设您使用的是 SPARQLWrapper 库。你很接近解决你的问题,你只需要转换你的QueryResult。只需调用 jsonData = sparql.query().convert()
而不是 jsonData = sparql.query()
,您将得到一个可以用 json.dump
写入 json 文件的字典。
我正在使用 python3 进行 SPARQL 查询。我需要读取 Virtuoso 数据库并输出三元组。三元组中的某些数据包含换行符等特殊字符。
反正我可以这样把数据拿出来:
queryString = "some query"
sparql.setQuery(queryString)
sparql.setReturnFormat(JSON)
try:
jsonData = sparql.query()
for result in jsonData:
print('Result: ***')
f.write(str(result) + '\n')
except:
print("Oops:", sys.exc_info()[0], file=sys.stderr)
执行此操作时,我在文件中得到以下输出:
b'{\n'
b' "head" : {\n'
b' "vars" : [\n'
b' "subject",\n'
b' "predicate",\n'
b' "object"\n'
b' ]\n'
b' },\n'
b' "results" : {\n'
b' "bindings" : [\n'
b' {\n'
b' "predicate" : {\n'
b' "type" : "uri",\n'
b' "value" : "http://www.w3.org/1999/02/22-rdf-syntax-ns#type"\n'
b' },\n'
b' "subject" : {\n'
b' "type" : "uri",\n'
b' "value" : "http://www.ontologyrepository.com/CommonCoreOntologies/delimits"\n'
b' },\n'
b' "object" : {\n'
b' "type" : "uri",\n'
b' "value" : "http://www.w3.org/2002/07/owl#InverseFunctionalProperty"\n'
b' }\n'
b' },\n'
等等。我不确定 b
前缀在这些行中的作用。无论如何,我在使用 JSON 库读取它时遇到了问题。所以我更喜欢写成JSON。
我想用
这样简单的东西替换 for 循环json.dump(jsonData, f)
或
json.dumps(jsonData, f)
当我这样做时,我收到错误消息 Oops: <class 'TypeError'>
。
我注意到 jsonData
的类型是 <class 'SPARQLWrapper.Wrapper.QueryResult'>
.
SPARQL 查询是否未返回 JSON?我还需要进行其他转换吗?
String 前面的 b 表示您的 String 不是字符串而是字节串,并且您的字节被解释为打印字符。 Look here for more information
下次如果您告诉我们更多您的问题会更容易。您使用的是什么库、哪个版本、示例查询等。
在您的情况下,我假设您使用的是 SPARQLWrapper 库。你很接近解决你的问题,你只需要转换你的QueryResult。只需调用 jsonData = sparql.query().convert()
而不是 jsonData = sparql.query()
,您将得到一个可以用 json.dump
写入 json 文件的字典。