Firefox本地消息:如何发送json和保存csv

时间:2018-07-02 16:53:58

标签: python json csv firefox-addon chrome-native-messaging

我目前正在开发Firefox附加组件,该附加组件应该与本地本机python程序进行交互。因此,有一个名为Background.js的JS文件,该文件将json消息发送到本机应用程序。

本机python应用程序应该接收到消息并将其存储在本地文件中。到目前为止,当我尝试将传入的json包保存在连续的csv文件中时,就会出现问题。

JS文件发送如下消息:

      {"messageId": countGlobalId(), "url": e.target.href,
      "innerHTML": e.target.innerHTML,
      "outerHTML": e.target.outerHTML,
      "tagName": e.target.tagName});
  }

给出了基本功能。在Python文件中,以下函数接收消息并返回jsonobject?!:

def getMessage():
    rawLength = sys.stdin.buffer.read(4)
    if len(rawLength) == 0:
        sys.exit(0)
    messageLength = struct.unpack('@I', rawLength)[0]
    message = sys.stdin.buffer.read(messageLength)#.decode('utf-8')
    jsonMessage= json.loads(message)
    return jsonMessage

问题来了;以下循环应该将传入数据保存到指定的csv文件中:

while True:
    receivedMessage = getMessage()
    if receivedMessage:
        messageString=json.dumps(receivedMessage)
        with open("ts.csv",'wb') as csvfile:
            writer= csv.DictWriter(csvfile,
                fieldnames=('messageId', 'url', 'innerHTML',
                'outerHTML', 'tagName'), extrasection='ignore') 
            #writer.writerows(receivedMessage)
            writer.writerows(messageString)
            # just trying alot of combinations above

发送消息...

我知道我的问题出在最后的while循环中,但是找不到答案。我尝试了一个更简单的版本,只是为了测试文件编写机制,并且效果很好:

    while True:
        receivedMessage = getMessage()
        if receivedMessage:
            file=open("ts.csv,'a')
            file.write(json.dumps(receivedMessage))
            file.close()
sendmessage...

除此之外,调试该项目的唯一方法是在单独的pyrthon测试文件中运行摘要,因为本机应用程序是由附加组件调用的,而没有控制台。

那么,我该如何流血地把json数据整齐地放入csv字典中?

目标是做这样的事情:

import csv
toCSV = [{'name':'bob','age':25,'weight':200},
         {'name':'jim','age':31,'weight':180}]
keys = toCSV[0].keys()
with open('people.csv', 'wb') as output_file:
    dict_writer = csv.DictWriter(output_file, keys)
    dict_writer.writeheader()
    dict_writer.writerows(toCSV)

How do I convert this list of dictionaries to a csv file?

这在封闭环境中可以正常工作。

但是当我将代码调整为:

while True:
    receivedMessage = getMessage()
    if receivedMessage:
        keys = receivedMessage[0].keys()
        with open('testfile.csv', 'wb') as output_file:
            dict_writer = csv.DictWriter(output_file, keys)
            dict_writer.writeheader()
            dict_writer.writerows(receivedMessage)

脚本停止。

编辑::::::::::::: 主要问题是我的原始消息有时包含空条目。为了解决这个问题,我在创建JS时添加了几行:

if (e.target.href)
  {urlVar= e.target.href;}
  else {urlVar= "empty";}
if (e.target.innerHTML)
  {innerHTMLVar= e.target.innerHTML;}
  else {innerHTMLVar= "empty";}
if (e.target.outerHTML)
  {outerHTMLVar= e.target.outerHTML;}
  else {outerHTMLVar= "empty";}
if (e.target.tagName)
  {tagNameVar= e.target.tagName;}
  else {tagNameVar= "empty";}

这似乎可以解决问题,现在python native应用可以按以下方式使用数据:

....
jsonMessage= json.loads(message)
...
    with open('testfile.csv', 'a', newline='') as csvfile:
        fieldnames = ['messageId', 'url', 'innerHTML', 'outerHTML', 'tagName']
        writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
        writer.writerow(jsonMessage)

0 个答案:

没有答案