在字符8192中插入的随机逗号在python“json”结果中调用node.js

我是一个刚刚学习python的JS开发人员。 这是我第一次尝试使用节点(v6.7.0)和Python(v2.7.1)在一起。 我正在使用python-runner作为我的python virtualenv的桥梁。 我的python脚本使用RAKE NLP关键字提取包。

我无法弄清楚为什么我的server.js中的返回数据在字符8192处插入一个随机逗号,并且大致为倍数。 除了地点以外没有其他的模式。 有时它在对象密钥string的中间,而在逗号分隔对象对之后的其他时间。 这完全破坏了返回数据上的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() {...}); 

keyword-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中插入的随机逗号在python“json”结果中调用node.js"

这看起来像一个缓冲区大小相关的错误,因为8192是2的幂。

这里主要的是要确切地分离发生故障的位置。 如果我正在debugging这个,我会的

  1. 仔细看看json.dumps的输出,通过在位置8191两边打印几个字符,最好是整数字符码(unicode,ASCII或其他)。

  2. 如果这看起来不错,我会尝试捕获python脚本的输出作为一个文件,并直接在节点服务器(即不要运行一个python脚本)读取。

  3. 如果是这样的话,创build一个python脚本来接收这个文件并输出它,而不需要操作,并让你的节点服务器执行那个python脚本,而不是现在正在使用的脚本。

这应该可以帮助你找出问题发生的地方。 从评论,我怀疑,这实质上是一个你无法控制的bug,除非你可以增加足够的python缓冲区大小,以保证你的数据永远不会吹缓冲区。 8K是相当小的,所以这可能是一个现实的解决scheme。

如果这是不够的,那么你可能会考虑处理节点服务器上的数据,如果你能一直依靠这个数据来移除每个字符在n * 8192 。 祝你好运。