Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python解析filePython中行的JSON部分_Python_Json - Fatal编程技术网

Python解析filePython中行的JSON部分

Python解析filePython中行的JSON部分,python,json,Python,Json,我想请您帮助我进行json解析。我有一个文件,每一行看起来都像这样: some hexadecimal numbers|something else|int|UA info|{'computer': {'os': {'version': 'blabla', 'name': 'blabla'}, 'app': {'version': 'blabla', 'name': 'blabla'}}} 我有一个代码,可以将每一行分成几个部分: for line in some_file: line

我想请您帮助我进行json解析。我有一个文件,每一行看起来都像这样:

some hexadecimal numbers|something else|int|UA info|{'computer': {'os': {'version': 'blabla', 'name': 'blabla'}, 'app': {'version': 'blabla', 'name': 'blabla'}}}
我有一个代码,可以将每一行分成几个部分:

for line in some_file:
    line2 = line.split('|')
我想把每一行的最后一部分(至少我认为应该是json格式)解析出来供将来使用(我的意思是我想写(到另一个文件)os=name版本,app=name版本)。我试过这样的方法:

json_string = json.loads(line2[4])
但是python告诉我一些错误:

应为属性名称:第1行第2列(字符1)

无法解码任何JSON对象

我知道这很愚蠢,但我不知道该怎么办。。。 如有任何建议,我将不胜感激。

JSON。这意味着您不能使用
json
按原样加载它

我将使用解析管道分隔文件并将最后一列值安全加载到Python字典中:

import csv
from ast import literal_eval


with open("file.csv") as f:
    reader = csv.reader(f, delimiter="|")
    data = [literal_eval(line[-1]) for line in reader]

print(data)  # data contains a list of dictionaries now

它不是JSON,但看起来像python文本

您可以使用转换为python对象:

import ast
ast.literal_eval(lines2[4])
顺便说一句,问题中缺少一个括号,因此:

ast.literal_eval(lines2[4] + '}')

JSON要求对任何字符串文本使用双引号

字符串是零个或多个Unicode字符的序列,用双引号括起来,使用反斜杠转义。-

一种简单且安全的解析方法是使用any。
YAML可以解析JSON,并且对语法要求不那么严格

>>> import yaml # from package pyyaml
>>> yaml.load("{'test': 'ok'}")
{'test': 'ok'}
>>> data = yaml.load("{'computer': {'os': {'version': 'blabla', 'name': 'blabla'}, 'app': {'version': 'blabla', 'name': 'blabla'}}}")
>>> data.get('computer').get('app').get('version')
'blabla'
对于管道分隔的数据,您可以像拆分一样拆分它们,或者使用
csv
module进行拆分。另外,您可以将每个数据块传递给
yaml.load
,它将处理转换:

import csv
import StringIO

some_file = StringIO.StringIO("0x1337|something else|12456789|UA info|{'computer': {'os': {'version': 'blabla', 'name': 'blabla'}, 'app': {'version': 'blabla', 'name': 'blabla'}}}")
elements = csv.reader(some_file, delimiter="|")
for element in elements[0]:
    print(yaml.load(element))
输出

4919
还有别的事吗
12456789
UA信息
{'computer':{'app':{'version':'blabla','name':'blabla'},'os':{'version':'blabla','name':'blabla'}


那之后呢?如何访问各个部件?