javascript - 从 node.js 调用的 python "json"结果中在字符 8192 处插入的随机逗号

标签 javascript python json node.js restify

我是一名刚学习 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 的幂。

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

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

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

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

这应该可以帮助您找出问题发生的位置。从评论中,我怀疑这本质上是一个你无法控制的错误,除非你可以增加 python 缓冲区大小足以保证你的数据永远不会破坏缓冲区。 8K 非常小,因此这可能是一个现实的解决方案。

如果这还不够,那么您可以考虑在 Node 服务器上处理数据,以删除 n * 8192 处的每个字符,如果您始终可以信赖的话。祝你好运。

关于javascript - 从 node.js 调用的 python "json"结果中在字符 8192 处插入的随机逗号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40028380/

相关文章:

javascript - 删除标签名称和所有选择器,但不删除内容

javascript - 处理grails中对象的未保存状态

python - 如何从函数外部获取函数参数和值?

python - 是否有类似 "iterate iterable if it has elements, else ..."的结构?

JavaScript 添加事件监听器

javascript - 如何停止CasperJS的执行,让用户输入一些值,然后继续执行?

python - 具有三角形值的三角轮廓

javascript - 使用 WebAPI Controller 序列化复杂的 json 对象

c# - 使 WCF 服务接受来自 jQuery.AJAX() 的 JSON 数据

json - 在显示 View 之前未读取 View 模型数据