Json到csv的转换在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

我正在尝试将一个非常大的json文件转换为csv。该代码可以很好地处理较小的文件,但在较大的文件上运行相同的代码会花费很多时间 我首先在包含80000个条目的91MB文件上测试了它,大约花了45分钟,但之后在包含300000个条目的更大文件上测试了大约5小时。有什么方法可以通过多重处理来实现吗?我是一个初级python程序员,所以我没有在python中使用多处理或多线程的想法。这是我的密码

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)