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

Python 使用JSON对象解析和处理大型文件的更有效方法,python,json,pandas,bigdata,Python,Json,Pandas,Bigdata,如何优化下面的代码?(Python是否可以,还是应该使用其他工具?) 这是迄今为止我问过的最疯狂的问题,但我想尝试一下,希望能得到一些关于我是否利用正确的工具和方法高效处理大量数据的建议。我不一定要在优化代码方面寻求帮助,除非有什么我完全忽略了的东西,但本质上我只是想知道我是否应该一起使用不同的框架而不是Python。我对Python还很陌生,不能完全确定是否可以更有效地处理大量数据并将其存储到DB中 下面的实现读取目录中的文本文件: 每个文本文件包含50K行JSON对象 在加载到数据库之前,

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

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

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

  • 每个文本文件包含50K行JSON对象
  • 在加载到数据库之前,需要对其进行解析和读取,然后将其转换为CSV
  • 我讨厌使用列表容器,我希望我可以研究用Python实现的其他东西,以便更好地实现它。我最初的想法是我应该使用发电机,但不是完全确定
  • 末尾的疯狂concat部分很重要,因为它将逗号分隔的列表转换为自己的行。
代码:

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

我建议使用pandas的read_json函数,它在创建数据帧时效率更高(它不会创建临时python dict),请参阅

  • 如果实际上没有json,那么进行字符串操作使其成为json通常是最好的选择*
  • 如果您有“形状怪异”的json,那么您可以在读取数据帧时,或者在读取数据帧后解析包含多个列的列(例如,使用Series string方法或apply)
*目前还不清楚实际的格式是什么,但通常不需要太多时间就可以将它们转换为有效的json


PythPythPosiple Posits:如果你有更多的缩进深度,考虑把它分解成更多的功能。(这里明显的选择是使用
f1(日志文件)
f2(行)
,但使用描述性名称……

一个效率低下的问题很容易解决:dict.keys()中的测试
x
首先创建一个包含所有键的列表,然后对该列表中的
x
进行线性搜索。直接在
dict
上测试安全壳不会创建额外的列表,并且具有恒定的运行时间。我还将把这三个
if
语句与
合并在一起。非常感谢。你能不能提供一个小例子,说明直接在dict上测试容器是什么样子的?在这个奇怪的concat构造中,“key36/62/65”每个都出现两次。这是故意的吗?@prometheus2305只是在dict中
x而不是dict.keys()中的
x
。谢谢你的帮助。我已经用我的最终实现更新了代码,这比我最初拥有的更快。我当然想测试一下pandas json库,谢谢@AndyHayden,看看它能快多少。
  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)