我是一个JS开发人员,正在学习python。这是我第一次尝试同时使用节点(v6.7.0)和python (v2.7.1)。我使用restify和python作为通向的桥梁。我的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() {...});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))发布于 2016-10-13 19:28:13
这看起来像一个与某个缓冲区大小有关的错误,因为8192是一个由两部分组成的函数。
这里的主要问题是准确地隔离故障发生的位置。如果我是在调试这个,我会
json.dumps的输出,在位置8191的两边打印几个字符,最好是整数字符代码(unicode、ASCII或其他任何字符)。这应该能帮助你找出问题在哪里发生。从注释中,我怀疑这本质上是一个您无法控制的bug,除非您能够增加python缓冲区的大小,以保证您的数据不会破坏缓冲区。8K很小,所以这可能是一个现实的解决方案。
如果这是不够的,那么您可以考虑处理节点服务器上的数据,以删除n * 8192上的每个字符,如果您可以持续地依赖它的话。祝好运。
https://stackoverflow.com/questions/40028380
复制相似问题