一位同事要求我将"yelp数据集挑战"中的6个大文件从"扁平"的常规JSON转换为CSV(他认为这些文件看起来像有趣的教学数据)。

我想我可以用:

1

2

3

4

5

6

7

8

9

10

11

12

13# With thanks to http://www.diveintopython3.net/files.html and https://www.reddit.com/r/MachineLearning/comments/33eglq/python_help_jsoncsv_pandas/cqkwyu8/

import os

import pandas

jsondir = 'c:\\example\\bigfiles\'

csvdir = 'c:\\example\\bigcsvfiles\'

if not os.path.exists(csvdir): os.makedirs(csvdir)

for file in os.listdir(jsondir):

with open(jsondir+file, 'r', encoding='utf-8') as f: data = f.readlines()

df = pandas.read_json('[' + ','.join(map(lambda x: x.rstrip(), data)) + ']')

df.to_csv(csvdir+os.path.splitext(file)[0]+'.csv',index=0,quoting=1)

不幸的是,我的计算机内存达不到这个文件大小的任务。(即使我摆脱了循环,虽然它在不到一分钟的时间内发出50MB的文件,但它仍在努力避免冻结我的计算机或崩溃在100MB以上的文件上,最大的文件是3.25GB。)

是否还有其他简单但性能良好的东西可以替代?

在一个循环中是很好的,但是如果文件名对内存有影响的话(只有6个文件),我也可以用单独的文件名运行6次。

这里是一个".json"文件内容的例子——注意每个文件实际上有很多json对象,每行1个。

1

2

3{"business_id":"xyzzy","name":"Business A","neighborhood":"","address":"XX YY ZZ","city":"Tempe","state":"AZ","postal_code":"85283","latitude":33.32823894longitude":-111.28948,"stars":3,"review_count":3,"is_open":0,"attributes":["BikeParking: True","BusinessAcceptsBitcoin: False","BusinessAcceptsCreditCards: True","BusinessParking: {'garage': False, 'street': False, 'validated': False, 'lot': True, 'valet': False}","DogsAllowed: False","RestaurantsPriceRange2: 2","WheelchairAccessible: True"],"categories":["Tobacco Shops","Nightlife","Vape Shops","Shopping"],"hours":["Monday 11:0-21:0","Tuesday 11:0-21:0","Wednesday 11:0-21:0","Thursday 11:0-21:0","Friday 11:0-22:0","Saturday 10:0-22:0","Sunday 11:0-18:0"],"type":"business"}

{"business_id":"dsfiuweio2f","name":"Some Place","neighborhood":"","address":"Strip or something","city":"Las Vegas","state":"NV","postal_code":"89106","latitude":36.189134,"longitude":-115.92094,"stars":1.5,"review_count":2,"is_open":1,"attributes":["BusinessAcceptsBitcoin: False","BusinessAcceptsCreditCards: True"],"categories":["Caterers","Grocery","Food","Event Planning & Services","Party & Event Planning","Specialty Food"],"hours":["Monday 0:0-0:0","Tuesday 0:0-0:0","Wednesday 0:0-0:0","Thursday 0:0-0:0","Friday 0:0-0:0","Saturday 0:0-0:0","Sunday 0:0-0:0"],"type":"business"}

{"business_id":"abccb","name":"La la la","neighborhood":"Blah blah","address":"Yay that","city":"Toronto","state":"ON","postal_code":"M6H 1L5","latitude":43.283984,"longitude":-79.28284,"stars":2,"review_count":6,"is_open":1,"attributes":["Alcohol: none","Ambience: {'romantic': False, 'intimate': False, 'classy': False, 'hipster': False, 'touristy': False, 'trendy': False, 'upscale': False, 'casual': False}","BikeParking: True","BusinessAcceptsCreditCards: True","BusinessParking: {'garage': False, 'street': False, 'validated': False, 'lot': False, 'valet': False}","Caters: True","GoodForKids: True","GoodForMeal: {'dessert': False, 'latenight': False, 'lunch': False, 'dinner': False, 'breakfast': False, 'brunch': False}","HasTV: True","NoiseLevel: quiet","OutdoorSeating: False","RestaurantsAttire: casual","RestaurantsDelivery: True","RestaurantsGoodForGroups: True","RestaurantsPriceRange2: 1","RestaurantsReservations: False","RestaurantsTableService: False","RestaurantsTakeOut: True","WiFi: free"],"categories":["Restaurants","Pizza","Chicken Wings","Italian"],"hours":["Monday 11:0-2:0","Tuesday 11:0-2:0","Wednesday 11:0-2:0","Thursday 11:0-3:0","Friday 11:0-3:0","Saturday 11:0-3:0","Sunday 11:0-2:0"],"type":"business"}

嵌套的JSON数据可以简单地保留为表示它的字符串文本——我只想将顶级键转换为CSV文件标题。

您可以尝试一次在一个JSON字典或一个csv行中读取整个文件,然后将其解析并插入csv,而不是一次读取和解析整个文件。它将需要更多的手工编码,但将在文件流样式下运行良好。

问题是,您的代码将整个文件读取到内存中,然后在内存中创建该文件的近副本。我怀疑它还创建了第三个副本,但还没有验证。NEOX建议的解决方案是逐行读取文件并进行相应的处理。这里是for循环的替换:

1

2

3

4

5

6

7

8for file in os.listdir(jsondir):

csv_file = csvdir + os.path.splitext(file)[0] + '.csv'

with open(jsondir+file, 'r', encoding='utf-8') as f, open(csv_file, 'w', encoding='utf-8') as csv:

header = True

for line in f:

df = pandas.read_json(''.join(('[', line.rstrip(), ']')))

df.to_csv(csv, header=header, index=0, quoting=1)

header = False

我已经在Mac上用python 3.5测试过这个;它应该在Windows上工作,但我还没有在那里测试过。

笔记:

我已经调整了您的JSON数据;第一行的纬度/经度似乎有错误。

这只是用一个小文件进行了测试;我不确定从何处获取3.5GB文件。

我假设这是你朋友的一次性用法。如果这是生产代码,则需要验证"with"语句的异常处理是否正确。看看如何在python中使用"with open"打开多个文件?详情。

这应该是相当好的表现,但我还是不确定从哪里得到你的大文件。

查看ijson,它使流式处理JSON文件像使用Python迭代器一样简单。

@凯文:问:为什么你的to_csv()不包括mode='a'参数?在一个with open中调用to_csv()会自动附加吗?而且,您的代码工作得很好——转换一个小文件需要更长的时间,但是我的计算机不再冻结,而且工作仍然在合理的时间内完成(应该很容易在一天结束之前完成),所以我可以让它在后台运行。非常感谢。(最后,我编辑了您的代码,以便在输出文件中包含UTF-8编码——在执行此操作之前,我一直在获取带有外部输入数据的错误。)

@ K。很高兴我能帮忙!由于csv已经打开,传递到to_csv()中,所以to_csv()在写入后不关闭文件。您可以通过查看源代码中的def save()来验证;它将close = False设置为第1476行。github.com/pandas dev/pandas/blob/master/pandas/formats/…。好问题!

python csv 大文件_Python性能调优:JSON到CSV,大文件相关推荐

  1. ceph分布式文件存储性能调优

    ceph分布式文件存储性能调优 一.硬件调优 二.BIOS配置 三.网络配置 四.OS配置 五.硬盘调度算法 六.软件层面 七.ceph参数调优 一.硬件调优 1.NVMe SSD 调优 ● 目的 为 ...

  2. Hive 大数据表性能调优

    大数据应用程序开发人员在从 Hadoop 文件系统或 Hive 表读取数据时遇到了挑战. 合并作业(一种用于将小文件合并为大文件的技术)有助于提高读取 Hadoop 数据的性能. 通过合并,文件的数量 ...

  3. 深入理解JVM虚拟机14:JVM性能调优的6大步骤,及关键调优参数详解

    JVM内存调优 对JVM内存的系统级的调优主要的目的是减少GC的频率和Full GC的次数. 1.Full GC 会对整个堆进行整理,包括Young.Tenured和Perm.Full GC因为需要对 ...

  4. Spark 性能常规性能调优广播大变量_大数据培训

    常规性能调优四:广播大变量 默认情况下,task中的算子中如果使用了外部的变量,每个task都会获取一份变量的复本,这就造成了内存的极大消耗.一方面,如果后续对RDD进行持久化,可能就无法将RDD数据 ...

  5. ES 性能调优,这可能是全网最详细的 Elasticsearch 性能调优指南

    文章目录 1.通用优化策略 1.1 通用最小化法则 1.2 职责单一原则 1.3 其他 2.写性能调优 2.1 基本原则 2.2 优化手段 2.2.1 增加 flush 时间间隔, 2.2.2 增加` ...

  6. 一篇最通俗易懂的性能调优总结,这篇就够了

    一,什么是性能调优? 在说什么是性能调优之前,我们先来说一下,计算机的体系结构. 如上图,简单来说包括三块:硬件.操作系统.应用程序.其实,性能调优就是调节这些内容,包括硬件.操作系统.应用程序.其中 ...

  7. 阿里资深软件测试工程师总结的这几点,让你轻松搞懂性能调优

    什么是性能调优?(what) 为什么需要性能调优?(why) 什么时候需要性能调优?(when) 什么地方需要性能调优?(where) 什么时候来进行性能调优?(who) 怎么样进行性能调优?(How ...

  8. 一篇让小白彻底搞懂性能调优!

    前言: 什么是性能调优?(what) 为什么需要性能调优?(why) 什么时候需要性能调优?(when) 什么地方需要性能调优?(where) 什么人来进行性能调优?(who) 怎么样进行性能调优?( ...

  9. 「入门运维必看」一篇让小白彻底搞懂性能调优!

    前言: 什么是性能调优?(what) 为什么需要性能调优?(why) 什么时候需要性能调优?(when) 什么地方需要性能调优?(where) 什么人来进行性能调优?(who) 怎么样进行性能调优?( ...

最新文章

  1. java 最小化 api_Java的API设计实践
  2. PICRUSt2分析实战:16S扩增子OTU或ASV预测宏基因组EC、通路、KO(200806更新)
  3. time Machine备份时间间隔
  4. C# Soap调WebService
  5. opencv python 图像形态学操作/图像腐蚀/图像膨胀/开运算/闭运算/顶帽/黑帽
  6. 泛微e9隐藏明细表_泛微E8 隐藏行、明细表
  7. 如何ALL IN一场技术大会?
  8. 用matlab做纹理合成,关于图像纹理合成的Matlab例程
  9. NodeJS的安装与使用
  10. Net框架下-ORM框架LLBLGen的简介(转载)
  11. java1.7环境_java1.7环境变量设置
  12. 踩过的坑:__file__、__package__和__name__
  13. 校园招聘--百度笔试
  14. 进程间通信----共享内存
  15. Bootstrap插件(一)——模态框(modal.js)
  16. 2023最新SSM计算机毕业设计选题大全(附源码+LW)之java面向新手投资者的虚拟股票交易系统h1o29
  17. 列车信息系统Java+MySQL(没完全实现)
  18. webstorm 常用插件集合
  19. 启用计算机的无线同屏,完美:将计算机转换为无线显示器,Windows 10的此功能确实强大...
  20. 大象高端营销:家装电话营销细节和技巧

热门文章

  1. 不同版本GCC编译器之间的切换
  2. linux i217 v网卡驱动,手动安装Intel network I217-LM网卡的Linux驱动
  3. leetcode_median of two sorted arrays
  4. 【笔记】基于轻量和积网络及无人机遥感图像的大豆田杂草识别
  5. [云炬创业管理笔记]第十章商业计划书答辩测试2
  6. [云炬创业基础笔记]第一章创业环境测试12
  7. ustc小道消息20220122
  8. 一个简单的c++/cli中委托与事件的处理模型
  9. OpenGL从入门到精通--纹理
  10. ifstat,iftop