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 的幂。

这里最主要的是准确地隔离发生故障的位置。如果我正在调试它,我会

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

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

  3. 如果可行,则创建一个 python 脚本来获取该文件并在不进行操作的情况下输出它,并让您的节点服务器执行该 python 脚本而不是它的脚本正在使用中

这应该可以帮助您找出问题所在。根据评论,我怀疑这本质上是一个您无法控制的错误,除非您可以将 python 缓冲区大小增加到足以保证您的数据永远不会破坏缓冲区。 8K 很小,所以这可能是一个现实的解决方案。

如果这还不够,那么您可以考虑在节点服务器上处理数据,以删除 n * 8192 处的每个字符,前提是您可以始终如一地依赖它。祝你好运。