用JSON对象解析和处理大文件的更有效方法

2024-09-26 17:48:29 发布

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

如何优化以下代码?(Python是否可以这样做,或者我应该使用其他工具?)在

这是迄今为止我问过的最疯狂的问题,但我将尝试一下,希望能得到一些关于我是否利用正确的工具和方法有效处理大量数据的建议。我不一定在寻找优化我的代码的帮助,除非我完全忽略了一些东西,但本质上我只是想知道我是否应该一起使用一个不同的框架,而不是Python。我对Python还很陌生,不完全确定是否可以更有效地处理大量数据并将其存储到DB中。在

以下实现读取目录中的文本文件:

  • 每个文本文件包含50K行JSON对象。。。在
  • 它需要被解析和读取,然后在加载到数据库之前转换成CSV。在
  • 我不喜欢使用列表容器,我希望我可以研究在Python中实现的其他方法,以更好地实现这一点。我最初的想法是我应该使用发电机,但并不完全确定。在
  • 结尾处疯狂的concat部分很重要,因为它将逗号分隔的列表转换为自己的行。 Converting Column with string separated values into rows

代码:

  triggerZipFiles = glob.glob('*.zip')
  for triggerFiles in triggerZipFiles:
      with zipfile.ZipFile(triggerFiles, 'r') as myzip:
          for logfile in myzip.namelist():
              datacc = []
              zipcc = []
              csvout = '{}_US.csv'.format(logfile[:-4])
              f = myzip.open(logfile)
              contents = f.readlines()
              for line in contents:
                  try:
                      parsed = json.loads(line[:-2])
                      if "CC" in parsed['data']['weatherType'] and "US" in parsed['zipcodes']:
                          datacc.append(parsed['data'])
                          zipcc.append(parsed['zipcodes'])
                  except:
                      pass
              if len(datacc) > 0:
                  df = pd.concat([pd.DataFrame(zipcc), pd.DataFrame(datacc)], axis=1)
                  df = pd.concat((pd.Series((v, row['key'], row['key'], row['key'],
                    row['key'], row['key'], row['key'], row['key'], row['key'],
                    row['key'], row['key'], row['key'], row['key'], row['key'],
                    row['key'], row['key'], row['key'], row['key'], row['key'],
                    row['key'], row['key'], row['key'], row['key'], row['key'],
                    row['key'], row['key'], row['key'], row['key'],
                    row['key'], row['key'], row['key'], row['key'],
                    row['key'], row['key'], row['key'], row['key'],
                    row['key'], row['key'], row['key'], row['key'], row['key'],
                    row['key'], row['key'], row['key'], row['key'],
                    row['key'], row['key'], row['key'], row['key'], row['key'],
                    row['key'], row['key'], row['key'], row['key'], row['key'], row['key'],
                    row['key'], row['key'], row['key'], row['key'], row['key'], row['key'],
                    row['key'], row['key'], row['key'], row['key'], row['key'], row['key'],
                    row['key'], row['key'], row['key'], row['key']), df.columns) for _,
                      row in df.iterrows() for v in row['US']), axis=1).T                
                  df.to_csv(csvout, header=None, index=False)
              else:
                  pass
              print datetime.now().strftime('%Y/%m/%d %H:%M:%S') + ": Finished: {}".format(logfile)

Tags: 工具key代码indfforparsedrow
1条回答
网友
1楼 · 发布于 2024-09-26 17:48:29

首先,对于json,并不是一个特别有用的度量!
第二,你的想法是正确的:你肯定想要基于块(分别读取/清理/转储每个部分)。在

我建议使用pandas的read_json函数,它在创建数据帧时效率更高(它不创建临时python dict),请参见reading in json section of the docs

  • 如果不存在实际上json,那么进行字符串操作使其成为json通常是您的最佳选择。*
  • 如果您有“形状奇怪”的json,那么您可以在读取时^{},或者在读取DataFrame之后解析包含多个列的列(例如使用Series string方法或apply)。在

*不清楚实际的格式是什么,但通常不需要太多的时间就可以将它们转换为有效的json。

Python的额外提示:如果您的缩进级别超过了几个级别,请考虑将其拆分成更多的函数。(这里最明显的选择是使用f1(logfile)和{},但使用描述性名称…)

相关问题 更多 >

    热门问题