Json到csv的转换在python中的大型文件上花费了大量时间
我正在尝试将一个非常大的json文件转换为csv。该代码可以很好地处理较小的文件,但在较大的文件上运行相同的代码会花费很多时间 我首先在包含80000个条目的91MB文件上测试了它,大约花了45分钟,但之后在包含300000个条目的更大文件上测试了大约5小时。有什么方法可以通过多重处理来实现吗?我是一个初级python程序员,所以我没有在python中使用多处理或多线程的想法。这是我的密码Json到csv的转换在python中的大型文件上花费了大量时间,python,json,pandas,csv,Python,Json,Pandas,Csv,我正在尝试将一个非常大的json文件转换为csv。该代码可以很好地处理较小的文件,但在较大的文件上运行相同的代码会花费很多时间 我首先在包含80000个条目的91MB文件上测试了它,大约花了45分钟,但之后在包含300000个条目的更大文件上测试了大约5小时。有什么方法可以通过多重处理来实现吗?我是一个初级python程序员,所以我没有在python中使用多处理或多线程的想法。这是我的密码 import json import time import pandas as pd csv_proj
import json
import time
import pandas as pd
csv_project=pd.DataFrame([],columns=['abstract','authors','n_citation',"references","title","venue","year",'id'])
with open('test.json','r') as f:
data = f.readlines()
j=0
for k,i in enumerate(data):
if '{' in i and '}' in i:
j+=1
dictionary=json.loads(i)
csv_project=csv_project.append(dictionary,ignore_index=True)
else:
pass
if j == 10000:
print(str(k)+'number of entries done')
csv_project.to_csv('data.csv')
j=0
csv_project.to_csv('data.csv')
任何有用的帮助都将不胜感激。
编辑这里是示例json格式
{"abstract": "AdaBoost algorithm based on Haar-like features can achieves high accuracy (above 95%) in object detection.",
"authors": ["Zheng Xu", "Runbin Shi", "Zhihao Sun", "Yaqi Li", "Yuanjia Zhao", "Chenjian Wu"],
"n_citation": 0,
"references": ["0a11984c-ab6e-4b75-9291-e1b700c98d52", "1f4152a3-481f-4adf-a29a-2193a3d4303c", "3c2ddf0a-237b-4d17-8083-c90df5f3514b", "522ce553-29ea-4e0b-9ad3-0ed4eb9de065", "579e5f24-5b13-4e92-b255-0c46d066e306", "5d0b987d-eed9-42ce-9bf3-734d98824f1b", "80656b4d-b24c-4d92-8753-bdb965bcd50a", "d6e37fb1-5f7e-448e-847b-7d1f1271c574"],
"title": "A Heterogeneous System for Real-Time Detection with AdaBoost",
"venue": "high performance computing and communications",
"year": 2016,
"id": "001eef4f-1d00-4ae6-8b4f-7e66344bbc6e"}
{"abstract": "In this paper, a kind of novel jigsaw EBG structure is designed and applied into conformal antenna array",
"authors": ["Yufei Liang", "Yan Zhang", "Tao Dong", "Shan-wei Lu"],
"n_citation": 0,
"references": [],
"title": "A novel conformal jigsaw EBG structure design",
"venue": "international conference on conceptual structures",
"year": 2016,
"id": "002e0b7e-d62f-4140-b015-1fe29a9acbaa"}
您将所有数据保存在内存中,一次作为行,一次作为数据帧。这可能会减慢您的处理速度 使用
csv
-模块将允许您以流模式处理文件:
import json
import csv
with open('test.json') as lines, open('data.csv', 'w') as output:
output = csv.DictWriter(output, ['abstract','authors','n_citation',"references","title","venue","year",'id'])
output.writeheader()
for line in lines:
line = line.strip()
if line[0] == '{' and line[-1] == '}':
output.writerow(json.loads(line))
您似乎正在读取一个文件,该文件可能如下所示:
{key1: value1, key2: [value2, value3, value4], key3: value3}
{key1: value4, key2: [value5, value6], key3: value7}
pd.read_json('test.json', lines=True)
请注意,末尾没有逗号,每行本身都是有效的json
格式
幸运的是,熊猫可以像这样直接读取json行
文件:
{key1: value1, key2: [value2, value3, value4], key3: value3}
{key1: value4, key2: [value5, value6], key3: value7}
pd.read_json('test.json', lines=True)
由于列名与json
键完全相同,因此无需提前设置空白的DataFrame
。read_json
将为您完成所有解析。例如:
df = pd.read_json('test.json', lines=True)
print(df)
abstract ... year
0 AdaBoost algorithm based on Haar-like features... ... 2016
1 In this paper, a kind of novel jigsaw EBG stru... ... 2016
[2 rows x 8 columns]
for j in json_reader:
print(j)
abstract ... year
0 AdaBoost algorithm based on Haar-like features... ... 2016
1 In this paper, a kind of novel jigsaw EBG stru... ... 2016
[2 rows x 8 columns]
abstract ... year
2 AdaBoost algorithm based on Haar-like features... ... 2016
3 In this paper, a kind of novel jigsaw EBG stru... ... 2016
[2 rows x 8 columns]
abstract ... year
4 AdaBoost algorithm based on Haar-like features... ... 2016
5 In this paper, a kind of novel jigsaw EBG stru... ... 2016
[2 rows x 8 columns]
更幸运的是,如果受大小限制,可以使用chunksize
参数将.read\u json
方法转换为生成器:
json_reader = pd.read_json('test.json', lines=True, chunksize=10000)
现在,当您遍历json\u reader
时,每次它都会从json
文件中输出接下来10000行的DataFrame
。例如:
df = pd.read_json('test.json', lines=True)
print(df)
abstract ... year
0 AdaBoost algorithm based on Haar-like features... ... 2016
1 In this paper, a kind of novel jigsaw EBG stru... ... 2016
[2 rows x 8 columns]
for j in json_reader:
print(j)
abstract ... year
0 AdaBoost algorithm based on Haar-like features... ... 2016
1 In this paper, a kind of novel jigsaw EBG stru... ... 2016
[2 rows x 8 columns]
abstract ... year
2 AdaBoost algorithm based on Haar-like features... ... 2016
3 In this paper, a kind of novel jigsaw EBG stru... ... 2016
[2 rows x 8 columns]
abstract ... year
4 AdaBoost algorithm based on Haar-like features... ... 2016
5 In this paper, a kind of novel jigsaw EBG stru... ... 2016
[2 rows x 8 columns]
结合所有这些新发现的知识,您可以使用chunksize=10000
并将分块的DataFrame
作为单独的csv
输出,如下所示:
for i, df in enumerate(json_reader):
df.to_csv('my_csv_file_{}'.format(i))
在这里,您注意到我组合了enumerate()
函数,这样我们就可以得到一个自动递增的索引号,并使用str.format()
函数将索引号附加到生成的csv
文件中
乍一看,我看到的最大问题是,在每个循环中重新分配一个新的附加的
pd.DataFrame
,这需要大量的处理能力。还可以手动解析json
文件(甚至部分解析)导入json后,import
就像从头开始建造自己的汽车,而不是驾驶你已经购买的汽车。你是否分析了你的代码,看看文件的读取或处理是否是瓶颈?@jdd读取不需要时间。它的编写需要花费大量时间time@Idlehands正如我所提到的,我是一名初级python程序员还在学习。你能详细说明一下如何克服这个问题吗?作为一个初学者没有什么丢脸的,我们都经历过。我只是想指出你的瓶颈在哪里。话虽如此,如果你能分享你的json
的结构作为一个例子,它将帮助我们改进。这给了我错误回溯(最近一次调用):文件“myscript.py”,第10行,在output.writerow(json.loads(line))文件“C:\Users\HP\AppData\Local\Programs\Python\Python37\lib\csv.py”,第155行,writerow返回self.writer.writerow(self.\u dict\u to\u list(rowdict))文件“C:\Users\HP\AppData\Local\Programs\Python\Python37\lib\encodings\cp1252.py”,第19行,在encode return codecs.charmap\u encode(输入,self.errors,encoding\u table)[0]UnicodeEncodeError:“charmap”编解码器无法对667位置的字符“\u0144”进行编码:字符映射感谢您是救生员(y)。刚刚在文件打开语法中添加了encoding='utf-8',它起作用了,但是每个条目中有1行的空间如何覆盖这个,例如,应该有80000行,但现在显示160000行。每个条目后面都有一行额外添加lineterminator='\n'
作为csv.DictWriter(…)
的参数,谢谢大家,你们今天对我来说太好了。过了糟糕的一天,然后你们来救我一天(y)