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

标签 python json pandas bigdata

如何优化下面的代码?(Python 可以吗?还是我应该使用其他工具?)

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

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

  • 每个文本文件包含 50K 行 JSON 对象...
  • 需要对其进行解析和读取,然后在加载到数据库之前将其转换为 CSV。
  • 我讨厌使用列表容器,我希望我可以研究在 Python 中实现其他东西,以便以更好的方式做到这一点。我最初的想法是我应该使用生成器,但并不完全确定。
  • 最后的疯狂连接部分很重要,因为它将逗号分隔的列表转换为自己的行。 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)

最佳答案

首先,对于 json 来说,行数并不是一个特别有用的指标!
其次,您有正确的想法:您肯定希望执行基于 block 的操作(分别读取/清理/转储每个部分)。

我建议使用 pandas 的 read_json 函数,它创建 DataFrame 的效率要高得多(它不会创建临时的 python 字典),请参阅 reading in json section of the docs .

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

*尚不清楚实际格式是什么,但通常不需要太多时间就能将它们变成有效 json。

Python 额外提示:如果您的缩进深度超过几个级别,请考虑将其分解为更多函数。 (这里明显的选择是使用 f1(logfile)f2(line),但使用描述性名称...)

关于python - 使用 JSON 对象解析和处理大文件的更有效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24686800/

相关文章:

python - 断言不相等的相同数据帧 - Python Pandas

python - Windows 10 Bash 和 python 路径

python - 模块 'qrcode' 没有属性 'make'

java - Android:数据可用仍然出现错误 NullPointerException

php - 数据不在 php json web api 中获取

javascript - HTTP PUT 方法返回未找到错误

python - 按列分组并将另一列的值分散到其他列中

python - 将 pandas 系列转换为对象数组,如 JavaScript 中所示

javascript - 如何确保用户只提交英文文本

python - Django NOT NULL 约束在上传文件时失败 userprofile.user_id