我是一名刚学习 python 的 JS 开发人员。这是我第一次尝试同时使用 node (v6.7.0) 和 python (v2.7.1)。我将 restify 与 python-runner 一起用作我的 python virtualenv 的桥梁。我的 python 脚本使用 RAKE NLP 关键字提取包。
我一辈子都弄不明白为什么我在 server.js 中的返回数据会在字符 8192 和大致倍数处插入一个随机逗号。除了位置,没有模式;有时它位于对象键字符串的中间,有时位于值中,有时位于分隔对象对的逗号之后。这完全破坏了返回数据上的 JSON.parse() 。下面的示例输出。当我从 python shell 运行脚本时,这不会发生。
我真的不明白为什么会这样,任何有经验的开发人员有什么想法吗?
浏览器中的示例输出
[..., {...ate': 1.0, 'intended recipient': 4.,0, 'correc...}, ...]
python shell 中的示例输出
[..., {...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() {...});
关键字提取.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 脚本的输出捕获为文件并直接在 Node 服务器中读取(即不运行 python 脚本)。
如果可行,则创建一个 python 脚本来获取该文件并在不进行任何操作的情况下输出它,并让您的 Node 服务器执行该 python 脚本而不是它现在正在使用的脚本。
这应该可以帮助您找出问题发生的位置。从评论中,我怀疑这本质上是一个你无法控制的错误,除非你可以增加 python 缓冲区大小足以保证你的数据永远不会破坏缓冲区。 8K 非常小,因此这可能是一个现实的解决方案。
如果这还不够,那么您可以考虑在 Node 服务器上处理数据,以删除 n * 8192
处的每个字符,如果您始终可以信赖的话。祝你好运。
关于javascript - 从 node.js 调用的 python "json"结果中在字符 8192 处插入的随机逗号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40028380/