Python解析filePython中行的JSON部分

2022-05-21 06:41:18 发布

您现在位置:Python中文网/ 问答频道 /正文

我想请求您帮助我解析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 version,app=name version)。我试过这样的方法:

json_string = json.loads(line2[4])

但是python告诉我一些错误:

Expecting property name: line 1 column 2 (char 1)

或者

No JSON object could be decoded

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


Tags: 文件namejsonapposversionlinesomeelsesomethingintnumbershexadecimalline2blabla
3条回答
网友
1楼 ·

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

可以使用^{}转换为python对象:

import ast
ast.literal_eval(lines2[4])

顺便说一句,问题中少了一个右括号,所以:

ast.literal_eval(lines2[4] + '}')
网友
2楼 ·

JSON需要double quotes作为任何字符串文本

A string is a sequence of zero or more Unicode characters, wrapped in double quotes, using backslash escapes. - http://www.json.org/

解析它的一种方法是使用任何YAML parser
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模块来完成。另外,您可以将每个数据块传递给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
something else
12456789
UA info
{'computer': {'app': {'version': 'blabla', 'name': 'blabla'}, 'os': {'version': 'blabla', 'name': 'blabla'}}}

网友
3楼 ·

JSONrequires double quotes for strings。这意味着您不能使用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