使用Pandas解析JSON行数据

4

我有一个包含数百万行的大型 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` 和异常处理:

由于文件很大,我使用了以下代码中的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的文档,但没有找到任何可以忽略未解析行的内容。可以有人帮忙吗?

这些行可以被删除吗? - cs95
看起来每个“measurement”都是自己的JSON对象,所以你的文件可能有很多JSON对象而不仅仅是一个,因此失败了? - Thomas Fauskanger
为什么你把for循环放在try块里面,而不是在每次迭代中都放一个try块? - Acccumulation
@coldspeed 不必删除这些错误行,但如果我能将其加载到数据框中,那对我来说就足够了。 - jujuBee
1个回答

0

终于找到了一个解决方案,可以摆脱文件中的错误消息。但是这个过程会增加清理文件的时间,并将其保存为新文件。

    #!/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)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接