python "json" 从 node.js 调用的结果中的字符 8192 处插入的随机逗号
Random comma inserted at character 8192 in python "json" result called from node.js
我是一名刚刚学习的 JS 开发人员 python。这是我第一次尝试同时使用 node (v6.7.0) 和 python (v2.7.1)。我将 restify 与 python-运行ner 一起用作我的 python virtualenv 的桥梁。我的 python 脚本使用 RAKE NLP 关键字提取包。
我想不通为什么我的 server.js 中的 return 数据会在字符 8192 处插入一个随机逗号并且大致是倍数的。除了位置,没有模式;有时它位于对象键字符串的中间,有时位于值中,有时位于分隔对象对的逗号之后。这完全破坏了 return 数据上的 JSON.parse() 。下面的示例输出。当我 运行 来自 python shell 的脚本时,这不会发生。
我真的不明白为什么会这样,有经验的开发者有什么想法吗?
浏览器中的示例输出
[..., {...ate': 1.0, 'intended recipient': 4.,0, 'correc...}, ...]
pythonshell
中的示例输出
[..., {...ate': 1.0, 'intended recipient': 4.0, 'correc...}, ...]
请忽略以下文件中有关对象转换和处理的任何差异。代码已被简化以展示问题
server.js
var restify = require('restify');
var py = require('python-runner');
var server = restify.createServer({...});
server.get('/keyword-extraction', function( req, res, next ) {
py.execScript(__dirname + '/keyword-extraction.py', {
bin: '.py/bin/python'
})
.then( function( data ) {
fData = JSON.parse(data); <---- ERROR
res.json(fData);
})
.catch( function( err ) {...});
return next();
});
server.listen(8001, 'localhost', function() {...});
关键词-extraction.py
import csv
import json
import RAKE
f = open( 'emails.csv', 'rb' )
f.readline() # skip line containing col names
outputData = []
try:
reader = csv.reader(f)
for row in reader:
email = {}
emailBody = row[7]
Rake = RAKE.Rake('SmartStoplist.txt')
rakeOutput = Rake.run(emailBody)
for tuple in rakeOutput:
email[tuple[0]] = tuple[1]
outputData.append(email)
finally:
file.close()
print( json.dumps(outputData))
这看起来像是与某些缓冲区大小有关的错误,因为 8192 是 2 的幂。
这里最主要的是准确地隔离发生故障的位置。如果我正在调试它,我会
仔细查看 json.dumps
的输出,在位置 8191 的两侧打印几个字符,最好是整数字符代码(unicode、ASCII 或其他)。
如果看起来没问题,我会尝试将 python 脚本的输出捕获为文件并直接在节点服务器中读取(即不要 运行 python 脚本)。
如果可行,则创建一个 python 脚本来获取该文件并在不进行操作的情况下输出它,并让您的节点服务器执行该 python 脚本而不是它的脚本正在使用中
这应该可以帮助您找出问题所在。根据评论,我怀疑这本质上是一个您无法控制的错误,除非您可以将 python 缓冲区大小增加到足以保证您的数据永远不会破坏缓冲区。 8K 很小,所以这可能是一个现实的解决方案。
如果这还不够,那么您可以考虑在节点服务器上处理数据,以删除 n * 8192
处的每个字符,前提是您可以始终如一地依赖它。祝你好运。
我是一名刚刚学习的 JS 开发人员 python。这是我第一次尝试同时使用 node (v6.7.0) 和 python (v2.7.1)。我将 restify 与 python-运行ner 一起用作我的 python virtualenv 的桥梁。我的 python 脚本使用 RAKE NLP 关键字提取包。
我想不通为什么我的 server.js 中的 return 数据会在字符 8192 处插入一个随机逗号并且大致是倍数的。除了位置,没有模式;有时它位于对象键字符串的中间,有时位于值中,有时位于分隔对象对的逗号之后。这完全破坏了 return 数据上的 JSON.parse() 。下面的示例输出。当我 运行 来自 python shell 的脚本时,这不会发生。
我真的不明白为什么会这样,有经验的开发者有什么想法吗?
浏览器中的示例输出
[..., {...ate': 1.0, 'intended recipient': 4.,0, 'correc...}, ...]
pythonshell
中的示例输出[..., {...ate': 1.0, 'intended recipient': 4.0, 'correc...}, ...]
请忽略以下文件中有关对象转换和处理的任何差异。代码已被简化以展示问题
server.js
var restify = require('restify');
var py = require('python-runner');
var server = restify.createServer({...});
server.get('/keyword-extraction', function( req, res, next ) {
py.execScript(__dirname + '/keyword-extraction.py', {
bin: '.py/bin/python'
})
.then( function( data ) {
fData = JSON.parse(data); <---- ERROR
res.json(fData);
})
.catch( function( err ) {...});
return next();
});
server.listen(8001, 'localhost', function() {...});
关键词-extraction.py
import csv
import json
import RAKE
f = open( 'emails.csv', 'rb' )
f.readline() # skip line containing col names
outputData = []
try:
reader = csv.reader(f)
for row in reader:
email = {}
emailBody = row[7]
Rake = RAKE.Rake('SmartStoplist.txt')
rakeOutput = Rake.run(emailBody)
for tuple in rakeOutput:
email[tuple[0]] = tuple[1]
outputData.append(email)
finally:
file.close()
print( json.dumps(outputData))
这看起来像是与某些缓冲区大小有关的错误,因为 8192 是 2 的幂。
这里最主要的是准确地隔离发生故障的位置。如果我正在调试它,我会
仔细查看
json.dumps
的输出,在位置 8191 的两侧打印几个字符,最好是整数字符代码(unicode、ASCII 或其他)。如果看起来没问题,我会尝试将 python 脚本的输出捕获为文件并直接在节点服务器中读取(即不要 运行 python 脚本)。
如果可行,则创建一个 python 脚本来获取该文件并在不进行操作的情况下输出它,并让您的节点服务器执行该 python 脚本而不是它的脚本正在使用中
这应该可以帮助您找出问题所在。根据评论,我怀疑这本质上是一个您无法控制的错误,除非您可以将 python 缓冲区大小增加到足以保证您的数据永远不会破坏缓冲区。 8K 很小,所以这可能是一个现实的解决方案。
如果这还不够,那么您可以考虑在节点服务器上处理数据,以删除 n * 8192
处的每个字符,前提是您可以始终如一地依赖它。祝你好运。