使用 pandas 解析 json 行

Posted

技术标签:

【中文标题】使用 pandas 解析 json 行【英文标题】:Parsing json lines using pandas 【发布时间】:2018-06-03 09:46:48 【问题描述】:

我有一个包含数百万行的大型 json 文件。该文件中还包含一些错误消息。以下是示例:

"MEASUREMENT_1":"12345678","MEASUREMENT_2":"123456789012","MEASUREMENT_3":"MEASUREMENT_TYPE","MEASUREMENT_4":1111111111111,"MEASUREMENT_5":-1122,"MEASUREMENT_6":-2233,"MEASUREMENT_7":"123456789"
"MEASUREMENT_1":"87654321","MEASUREMENT_2":"987654321098","MEASUREMENT_3":"MEASUREMENT_TYPE_2","MEASUREMENT_4":222222222222,"MEASUREMENT_5":-4455,"MEASUREMENT_6":-6677,"MEASUREMENT_7":"123456789"
[2015-12-02 02:00:02,530] WARN Reconnect due to socket error: null 
[2015-12-02 02:00:02,633] WARN Reconnect due to socket error: null 

正如预期的那样,由于文件中的错误消息行,下面的代码会抛出一个ValueError

#!/usr/bin/python3.5
import pandas as pd # Version 0.21.0
df = pd.read_json(file, lines=True)

由于这是一个非常大的文件,我使用了chunksize 和一个期望,如下所示:

max_records = 1e5
df = pd.read_json(file, lines=True, chunksize=max_records)
filtered_data = pd.DataFrame() # Initialize the dataframe
try:
   for df_chunk in df:
       filtered_data = pd.concat([filtered_data, df_chunk])
except ValueError:
       print ('\nSome messages in the file cannot be parsed')

但上述方法的缺点是它遗漏了一些行。有没有更好的方法来做到这一点?我浏览了http://pandas.pydata.org/pandas-docs/stable/generated/pandas.read_json.html 的文档,但找不到任何可以忽略未解析行的内容。有人可以帮忙吗?

【问题讨论】:

去掉这些线可行吗? 看起来每个“测量”都是它自己的 json 对象,所以也许你的文件有很多 json 对象,而不仅仅是一个,因此失败了? 为什么在 try 块内有 for 循环,而不是在 for 循环的每次迭代中都有一个 try 块? @coldspeed 不需要删除这些错误行,但是如果我可以加载它做一个数据框,那应该对我有用。 【参考方案1】:

最后,找到了摆脱文件中错误消息的解决方案。但是,此过程会增加额外的时间来清理文件并将其另存为新文件

    #!/usr/bin/python3.5

    import re
    import pandas as pd # Version 0.21.0

    def clean_data(filename):
        with open(filename, "r") as inputfile:
            for row in inputfile:
                if re.match("\[", row) is None:
                    yield row

   with open(clean_file,  'w') as outputfile:
        for row in clean_data(filename):
            outputfile.write(row)

   max_records = 1e5
   df = pd.read_json(clean_file, lines=True, chunksize=max_records)

【讨论】:

以上是关于使用 pandas 解析 json 行的主要内容,如果未能解决你的问题,请参考以下文章

使用 Python/Pandas 库无法解析来自 JSON 响应的数据

使用 pandas python 将嵌套的 JSON 解析为多个数据帧

使用 Pandas 在巨大的 CSV 中解析带有嵌套值的 JSON 列

使用包含嵌套 JSON 字符串的一列解析 Pandas DataFrame 中的列

pandas DataFrame 使用 to_json() 到字典列表

解析嵌套的 JSON 并迭代到 Pandas Dataframe