是否可以通过python将普通文本转换为JSON格式?

是否可以通过python将普通文本转换为JSON格式?,python,json,Python,Json,我已经开始对python有了很好的了解,同时我看到了一篇JSON文章。因此,我想将这两个概念结合起来。 目前我有一个小脚本(python脚本),它触发一些内置命令并将输出存储在文件中 下面是代码片段 import subprocess, os output_file_object = open("output.txt", "wb") command = ['/bin/ls', '-l'] command_output = subprocess.check_output(comma

我已经开始对python有了很好的了解,同时我看到了一篇JSON文章。因此,我想将这两个概念结合起来。 目前我有一个小脚本(python脚本),它触发一些内置命令并将输出存储在文件中

下面是代码片段

import subprocess, os

output_file_object = open("output.txt", "wb")       
command = ['/bin/ls', '-l']
command_output = subprocess.check_output(command)
output_file_object.write(command_output)
output_file_object.close()
print 'Done'
将创建该文件并包含输出

是否有任何方法可以将此输出保存为JSON格式? 有API或什么吗? 我必须遵循哪些可能的先决条件或步骤

任何建议都是非常值得赞赏的


谢谢,

一旦您从
ls
命令检索到输出:

>>> out = subprocess.check_output(command)
您只需提取所需内容,例如:

>>> # Get the lines, remove the first and the last ones, and split into columns
>>> out = [o.split() for o in out.split('\n')[1:-1]]
然后您只需使用json模块:

>>> import json
>>> json_out = json.dumps(out)
>>> with open('output.json', 'w') as f:
>>>     f.write(json_out)

显然,你必须比我在这里做得更好,因为将ls拆分为列并不能输出真正可读的JSON(你会得到大量字符串,日期被拆分为3部分)。

我很高兴回答我自己的问题,我希望这能帮助有需要的人

我使用了一个名为明胶()的API。你将不得不自己设置明胶,因为我没有在这里解释设置过程。 起初,这看起来像是一项繁重的任务,但您得到的输出确实是值得的。内部使用python的json模块

为了获得完美的输出,您必须使用明胶语法。简单地说,我可以说明胶的“语法”就像任何语言的“功能”

“语法”完全基于正则表达式(regex)。对你必须在这里了解一点正则表达式。这将使语法定义的任务变得容易

让我们回到我问题的解决方案上来

我有一个文本文件,它是
ls
命令的输出。文件内容如下所示:

total 20 
-rw-rw-r-- 1 shiv shiv   0 Apr 25 10:42 output.txt
-rw-r--r-- 1 shiv shiv 296 Apr 25 10:41 temp-script.py
现在让我们从定义语法开始

您必须根据需要定义一个新的语法文件。 这是我为“输出命令”制作的语法文件

顶部是正则表达式,我想它们是不言自明的 (重要)-“语法输入”是入口点。明胶解析器将从这里开始执行。它相当于C和C++中的“主”。p> 定义语法文件很有趣。你必须把每件事都告诉语法分析器

在“语法输入”中,我告诉解析器“匹配”以“total”开头的内容,后跟空格(ws),后跟“digit”,最后是换行符(nl)。 一旦找到此匹配项,它将打开一个名为“tag1”的json标记(您可以根据自己的方便命名)

打开标记后,下一行是调用另一个名为“content”的语法(也可以是任何名称)

现在,“语法内容”将在以“permission”开头的行中找到,它只是权限的正则表达式。 一旦匹配完整行,即(权限ws值字段_end), 它将执行out.add_属性函数(“out”是一个内置对象)

(注意—“权限”为$0,“ws”为$1,“值”为$2,依此类推。)

out.add_attribute('.', 'content-stuff', '$2')
记住我们在“tag1”中,
“.”表示当前标签
'content-stuff'-Json“key”
'$2'--JSON“值”

out.open('content')-这主要用于创建数组

随着语法的定义,执行命令的时间到了

gel-s-f json

gel-s syntax.gel-f json output.txt

这确实花了一些时间,但我想和大家分享一些愚蠢(但很搞笑)的事情,在定义语法文件时,您必须认真注意这些事情,否则您会发疯的

-确保行尾(右侧)没有空格,尤其是在定义“语法”(在“:”之后)时。[在语法文件中]

-注意使用空格而不使用制表符。[在syntx文件中]
制表符相当于四个空格,但您必须手动指定四个空格,单个制表符将导致语法错误

“match”语句不接受空格ie(如下所述)


标准库()中有一个JSON模块,但在创建JSON文件之前,您必须解析来自
ls
的输出。如果您想使用regexp进行解析,请查看
re
模块。您期望的JSON表示形式是什么类型?@dilbert-我完全明白!JSON有不同的表示形式吗?请纠正我,我对JSON不太熟悉。这听起来很简单有趣。我正在尝试一下。我使用了这个方法。毫无疑问,它是有效的,但有一个小问题。我将输出作为一个完整的字符串。“总计435\n-rw-r--r--1 shiv shiv 1012 Apr 7 14:41 File.txt\n-rw-r--r--shiv shiv…”正如你所说的,我必须首先定义格式,不是吗?我也听说过“明胶”我认为这也会有帮助。是的,你必须定义你想要的输出格式。你可以使用
out.split('\n')
(参见我的帖子)轻松地按行分割输出。事实上,一旦你定义了你想要的格式,你应该创建一种方法
parseLine
,然后执行
[parseLine(line)对于line-in-out.split('\n')[1:-1]
。那么json.dumps()将为您处理转换。
out.add_attribute('.', 'content-stuff', '$2')
{
    "tag1": {
        "content": [
            {
                "@content-stuff": "1 shiv shiv   0 Apr 25 10:42 output.txt", 
                "@permission": "-rw-rw-r--"
            }, 
            {
                "@content-stuff": "1 shiv shiv 296 Apr 25 10:41 temp-script.py", 
                "@permission": "-rw-r--r--"
            } 
        ]
    }
}
`-match 'Defines Permissions:' -->will NOT work`
`-match 'Defines' ws 'Permissions:' --> will WORK`