programing

JSON을 CSV로 변환하려면 어떻게 해야 합니까?

procenter 2022. 12. 9. 22:15
반응형

JSON을 CSV로 변환하려면 어떻게 해야 합니까?

CSV 파일로 변환할 JSON 파일이 있습니다.Python으로 어떻게 하면 좋을까요?

나는 시도했다.

import json
import csv

f = open('data.json')
data = json.load(f)
f.close()

f = open('data.csv')
csv_file = csv.writer(f)
for item in data:
    csv_file.writerow(item)

f.close()

하지만, 그것은 효과가 없었다.저는 Django를 사용하고 있는데, 다음과 같은 오류가 발생했습니다.

`file' object has no attribute 'writerow'`

그 후 다음을 시도했습니다.

import json
import csv

f = open('data.json')
data = json.load(f)
f.close()

f = open('data.csv')
csv_file = csv.writer(f)
for item in data:
    f.writerow(item)  # ← changed

f.close()

다음 오류가 나타납니다.

`sequence expected`

샘플 json 파일:

[{
        "pk": 22,
        "model": "auth.permission",
        "fields": {
            "codename": "add_logentry",
            "name": "Can add log entry",
            "content_type": 8
        }
    }, {
        "pk": 23,
        "model": "auth.permission",
        "fields": {
            "codename": "change_logentry",
            "name": "Can change log entry",
            "content_type": 8
        }
    }, {
        "pk": 24,
        "model": "auth.permission",
        "fields": {
            "codename": "delete_logentry",
            "name": "Can delete log entry",
            "content_type": 8
        }
    }, {
        "pk": 4,
        "model": "auth.permission",
        "fields": {
            "codename": "add_group",
            "name": "Can add group",
            "content_type": 2
        }
    }, {
        "pk": 10,
        "model": "auth.permission",
        "fields": {
            "codename": "add_message",
            "name": "Can add message",
            "content_type": 4
        }
    }
]

pandas 라이브러리, 이것은 두 개의 명령어를 사용하는 것만큼 쉽습니다!

df = pd.read_json()

read_json은 JSON 문자열을 팬더 개체(시리즈 또는 데이터 프레임)로 변환합니다.그 후, 다음과 같이 입력합니다.

df.to_csv()

문자열을 반환하거나 CSV 파일에 직접 쓸 수 있습니다.to_csv에 대해서는 문서를 참조해 주세요.

지금까지의 답변의 장황함에 근거해, 우리는 모두 판다에게 지름길을 준 것에 감사해야 한다.

구조화되지 않은 JSON의 경우 다음 답변을 참조하십시오.

편집: 최소 작동 예제를 요청했습니다.

import pandas as pd

with open('jsonfile.json', encoding='utf-8') as inputfile:
    df = pd.read_json(inputfile)

df.to_csv('csvfile.csv', encoding='utf-8', index=False)

첫째, JSON에는 네스트된 개체가 있기 때문에 일반적으로 CSV로 직접 변환할 수 없습니다.다음과 같이 변경해야 합니다.

{
    "pk": 22,
    "model": "auth.permission",
    "codename": "add_logentry",
    "content_type": 8,
    "name": "Can add log entry"
},
......]

여기서 CSV를 생성하는 코드는 다음과 같습니다.

import csv
import json

x = """[
    {
        "pk": 22,
        "model": "auth.permission",
        "fields": {
            "codename": "add_logentry",
            "name": "Can add log entry",
            "content_type": 8
        }
    },
    {
        "pk": 23,
        "model": "auth.permission",
        "fields": {
            "codename": "change_logentry",
            "name": "Can change log entry",
            "content_type": 8
        }
    },
    {
        "pk": 24,
        "model": "auth.permission",
        "fields": {
            "codename": "delete_logentry",
            "name": "Can delete log entry",
            "content_type": 8
        }
    }
]"""

x = json.loads(x)

f = csv.writer(open("test.csv", "wb+"))

# Write CSV Header, If you dont need that, remove this line
f.writerow(["pk", "model", "codename", "name", "content_type"])

for x in x:
    f.writerow([x["pk"],
                x["model"],
                x["fields"]["codename"],
                x["fields"]["name"],
                x["fields"]["content_type"]])

다음과 같이 출력됩니다.

pk,model,codename,name,content_type
22,auth.permission,add_logentry,Can add log entry,8
23,auth.permission,change_logentry,Can change log entry,8
24,auth.permission,delete_logentry,Can delete log entry,8

당신의 JSON 파일이 사전 목록에 디코딩될 것이라고 생각합니다.먼저 JSON 객체를 평평하게 하는 기능이 필요합니다.

def flattenjson(b, delim):
    val = {}
    for i in b.keys():
        if isinstance(b[i], dict):
            get = flattenjson(b[i], delim)
            for j in get.keys():
                val[i + delim + j] = get[j]
        else:
            val[i] = b[i]
            
    return val

JSON 개체에서 이 스니펫을 실행한 결과:

flattenjson({
    "pk": 22, 
    "model": "auth.permission", 
    "fields": {
      "codename": "add_message", 
      "name": "Can add message", 
      "content_type": 8
    }
  }, "__")

{
    "pk": 22, 
    "model": "auth.permission", 
    "fields__codename": "add_message", 
    "fields__name": "Can add message", 
    "fields__content_type": 8
}

이 함수를 JSON 객체의 입력 배열에 있는 각 dict에 적용한 후:

input = map(lambda x: flattenjson( x, "__" ), input)

관련 열 이름을 찾습니다.

columns = [x for row in input for x in row.keys()]
columns = list(set(columns))

csv 모듈을 통해 실행하는 것은 어렵지 않습니다.

with open(fname, 'wb') as out_file:
    csv_w = csv.writer(out_file)
    csv_w.writerow(columns)

    for i_r in input:
        csv_w.writerow(map(lambda x: i_r.get(x, ""), columns))

도움이 됐으면 좋겠네요!

JSON은 다양한 데이터 구조를 나타낼 수 있습니다.JS "개체"는 대략 Python dict(문자열 키 포함), JS "배열"은 대략 Python 목록과 비슷하며, 최종 "리프" 요소가 숫자 또는 문자열이면 중첩할 수 있습니다.

CSV는 기본적으로 2-D 테이블만 나타낼 수 있습니다.옵션으로 첫 번째 행의 "headers"(열 이름)를 사용하여 테이블을 일반 해석 대신 딕트 목록으로 해석할 수 있습니다.목록은 숫자 또는 문자열이 될 수 있습니다.

따라서 일반적인 경우 임의의 JSON 구조를 CSV로 변환할 수 없습니다.몇 가지 특수한 경우(더 이상 중첩되지 않는 어레이, 모두 동일한 키를 가진 개체 어레이)를 수행할 수 있습니다.당신의 문제에 적용되는 특별한 경우는 무엇입니까?솔루션의 자세한 내용은 보유하고 있는 특별한 사례에 따라 달라집니다.어떤 것이 적용되는지조차 언급하지 않는 놀라운 사실로 미루어 볼 때, 저는 당신이 그 제약에 대해 고려하지 않았을 수도 있고, 실제로 사용할 수 있는 경우도 해당되지 않으며, 당신의 문제는 해결하기가 불가능하다고 생각합니다.하지만 확실히 해 주세요!

플랫 오브젝트의 임의의 json 리스트를 csv로 변환하는 범용 솔루션.

명령줄에서 input.json 파일을 첫 번째 인수로 전달합니다.

import csv, json, sys

input = open(sys.argv[1])
data = json.load(input)
input.close()

output = csv.writer(sys.stdout)

output.writerow(data[0].keys())  # header row

for row in data:
    output.writerow(row.values())

사용처:

  • 를 "OP"라는 test.json.
  • encoding='utf-8'는 여기서 사용되고 있습니다만, 그 외의 경우는 필요 없을 수 있습니다.
  • 다음 코드는 라이브러리를 활용합니다.
    • .open입니다.pathlib.
    • Windows 이외의 패스에서도 동작합니다.
  • pandas.to_csv(...) 파일에 합니다.csv 파일입니다
import pandas as pd
# As of Pandas 1.01, json_normalize as pandas.io.json.json_normalize is deprecated and is now exposed in the top-level namespace.
# from pandas.io.json import json_normalize
from pathlib import Path
import json

# set path to file
p = Path(r'c:\some_path_to_file\test.json')

# read json
with p.open('r', encoding='utf-8') as f:
    data = json.loads(f.read())

# create dataframe
df = pd.json_normalize(data)

# dataframe view
 pk            model  fields.codename           fields.name  fields.content_type
 22  auth.permission     add_logentry     Can add log entry                    8
 23  auth.permission  change_logentry  Can change log entry                    8
 24  auth.permission  delete_logentry  Can delete log entry                    8
  4  auth.permission        add_group         Can add group                    2
 10  auth.permission      add_message       Can add message                    4

# save to csv
df.to_csv('test.csv', index=False, encoding='utf-8')

CSV 출력:

pk,model,fields.codename,fields.name,fields.content_type
22,auth.permission,add_logentry,Can add log entry,8
23,auth.permission,change_logentry,Can change log entry,8
24,auth.permission,delete_logentry,Can delete log entry,8
4,auth.permission,add_group,Can add group,2
10,auth.permission,add_message,Can add message,4

더 많이 중첩된 JSON 개체를 위한 리소스:

는, 데이터가 「JSON」이라고 하는 data.json.

import json
import csv

with open("data.json") as file:
    data = json.load(file)

with open("data.csv", "w") as file:
    csv_file = csv.writer(file)
    for item in data:
        fields = list(item['fields'].values())
        csv_file.writerow([item['pk'], item['model']] + fields)

csv.DictWriter()상세한 실장은 다음과 같습니다.

def read_json(filename):
    return json.loads(open(filename).read())
def write_csv(data,filename):
    with open(filename, 'w+') as outf:
        writer = csv.DictWriter(outf, data[0].keys())
        writer.writeheader()
        for row in data:
            writer.writerow(row)
# implement
write_csv(read_json('test.json'), 'output.csv')

이 경우 모든 JSON 개체의 필드가 동일하다고 가정합니다.

여기 도움이 될 만한 참고 자료가 있습니다.

Dan이 제안한 솔루션을 사용하는 데 어려움을 겪고 있었지만, 이 방법은 효과가 있었습니다.

import json
import csv 

f = open('test.json')
data = json.load(f)
f.close()

f=csv.writer(open('test.csv','wb+'))

for item in data:
  f.writerow([item['pk'], item['model']] + item['fields'].values())

여기서 "test.json"에는 다음이 포함됩니다.

[ 
{"pk": 22, "model": "auth.permission", "fields": 
  {"codename": "add_logentry", "name": "Can add log entry", "content_type": 8 } }, 
{"pk": 23, "model": "auth.permission", "fields": 
  {"codename": "change_logentry", "name": "Can change log entry", "content_type": 8 } }, {"pk": 24, "model": "auth.permission", "fields": 
  {"codename": "delete_logentry", "name": "Can delete log entry", "content_type": 8 } }
]

앞의 답변에서 설명한 바와 같이 json을 csv로 변환하는 데 어려움이 있는 것은 json 파일에 중첩된 사전이 포함되어 다차원 데이터 구조인 csv와 2D 데이터 구조인 csv가 있기 때문입니다.단, 다차원 구조를 csv로 변환하는 좋은 방법은 프라이머리 키와 결합하는 여러 csv를 갖는 것입니다.

이 예에서는 첫 번째 csv 출력에 컬럼으로 "pk", "model", "fields"가 있습니다."pk" 및 "model" 값은 쉽게 얻을 수 있지만 "fields" 열에는 사전이 포함되어 있기 때문에 자체 csv여야 합니다.또한 "codename"이 프라이머리 키로 표시되므로 "fields"의 입력으로 사용하여 첫 번째 csv를 완료할 수 있습니다.두 번째 csv에는 2개의 csv를 결합하기 위해 사용할 수 있는 프라이머리 키로서 코드명을 가진 "fields" 컬럼의 딕셔너리가 포함되어 있습니다.

다음은 중첩된 사전을 2csvs로 변환하는 json 파일용 솔루션입니다.

import csv
import json

def readAndWrite(inputFileName, primaryKey=""):
    input = open(inputFileName+".json")
    data = json.load(input)
    input.close()

    header = set()

    if primaryKey != "":
        outputFileName = inputFileName+"-"+primaryKey
        if inputFileName == "data":
            for i in data:
                for j in i["fields"].keys():
                    if j not in header:
                        header.add(j)
    else:
        outputFileName = inputFileName
        for i in data:
            for j in i.keys():
                if j not in header:
                    header.add(j)

    with open(outputFileName+".csv", 'wb') as output_file:
        fieldnames = list(header)
        writer = csv.DictWriter(output_file, fieldnames, delimiter=',', quotechar='"')
        writer.writeheader()
        for x in data:
            row_value = {}
            if primaryKey == "":
                for y in x.keys():
                    yValue = x.get(y)
                    if type(yValue) == int or type(yValue) == bool or type(yValue) == float or type(yValue) == list:
                        row_value[y] = str(yValue).encode('utf8')
                    elif type(yValue) != dict:
                        row_value[y] = yValue.encode('utf8')
                    else:
                        if inputFileName == "data":
                            row_value[y] = yValue["codename"].encode('utf8')
                            readAndWrite(inputFileName, primaryKey="codename")
                writer.writerow(row_value)
            elif primaryKey == "codename":
                for y in x["fields"].keys():
                    yValue = x["fields"].get(y)
                    if type(yValue) == int or type(yValue) == bool or type(yValue) == float or type(yValue) == list:
                        row_value[y] = str(yValue).encode('utf8')
                    elif type(yValue) != dict:
                        row_value[y] = yValue.encode('utf8')
                writer.writerow(row_value)

readAndWrite("data")

알렉의 답변은 훌륭하지만 여러 단계의 둥지가 있는 경우에는 효과가 없습니다.다음은 여러 수준의 중첩을 지원하는 수정된 버전입니다.또한 중첩된 객체가 자체 키를 이미 지정한 경우 헤더 이름을 조금 더 좋게 만듭니다(예: Firebase Analytics / BigTable / BigQuery 데이터).

"""Converts JSON with nested fields into a flattened CSV file.
"""

import sys
import json
import csv
import os

import jsonlines

from orderedset import OrderedSet

# from https://stackoverflow.com/a/28246154/473201
def flattenjson( b, prefix='', delim='/', val=None ):
  if val is None:
    val = {}

  if isinstance( b, dict ):
    for j in b.keys():
      flattenjson(b[j], prefix + delim + j, delim, val)
  elif isinstance( b, list ):
    get = b
    for j in range(len(get)):
      key = str(j)

      # If the nested data contains its own key, use that as the header instead.
      if isinstance( get[j], dict ):
        if 'key' in get[j]:
          key = get[j]['key']

      flattenjson(get[j], prefix + delim + key, delim, val)
  else:
    val[prefix] = b

  return val

def main(argv):
  if len(argv) < 2:
    raise Error('Please specify a JSON file to parse')

  print "Loading and Flattening..."
  filename = argv[1]
  allRows = []
  fieldnames = OrderedSet()
  with jsonlines.open(filename) as reader:
    for obj in reader:
      # print 'orig:\n'
      # print obj
      flattened = flattenjson(obj)
      #print 'keys: %s' % flattened.keys()
      # print 'flattened:\n'
      # print flattened
      fieldnames.update(flattened.keys())
      allRows.append(flattened)

  print "Exporting to CSV..."
  outfilename = filename + '.csv'
  count = 0
  with open(outfilename, 'w') as file:
    csvwriter = csv.DictWriter(file, fieldnames=fieldnames)
    csvwriter.writeheader()
    for obj in allRows:
      # print 'allRows:\n'
      # print obj
      csvwriter.writerow(obj)
      count += 1

  print "Wrote %d rows" % count



if __name__ == '__main__':
  main(sys.argv)

이 질문이 나온 지 오래되었다는 것은 알지만, 저는 다른 모든 사람들의 답변에 덧붙여 매우 간결하게 해결책을 설명하는 블로그 포스트를 공유해야겠다고 생각했습니다.

여기 링크가 있습니다.

쓰기 위해 파일 열기

employ_data = open('/tmp/EmployData.csv', 'w')

csv 기록기 개체를 만듭니다.

csvwriter = csv.writer(employ_data)
count = 0
for emp in emp_data:
      if count == 0:
             header = emp.keys()
             csvwriter.writerow(header)
             count += 1
      csvwriter.writerow(emp.values())

내용을 저장하려면 파일을 닫으십시오.

employ_data.close()

이 방법은 그다지 현명한 방법은 아니지만, 저도 같은 문제를 겪었고, 이 방법은 제게 효과가 있었습니다.

import csv

f = open('data.json')
data = json.load(f)
f.close()

new_data = []

for i in data:
   flat = {}
   names = i.keys()
   for n in names:
      try:
         if len(i[n].keys()) > 0:
            for ii in i[n].keys():
               flat[n+"_"+ii] = i[n][ii]
      except:
         flat[n] = i[n]
   new_data.append(flat)  

f = open(filename, "r")
writer = csv.DictWriter(f, new_data[0].keys())
writer.writeheader()
for row in new_data:
   writer.writerow(row)
f.close()

놀랍게도 지금까지 여기에 게시된 답변 중 가능한 모든 시나리오(예: 중첩된 딕트, 중첩된 목록, 없음 값 등)를 올바르게 다루는 답변은 없습니다.

이 솔루션은 모든 시나리오에서 동작합니다.

def flatten_json(json):
    def process_value(keys, value, flattened):
        if isinstance(value, dict):
            for key in value.keys():
                process_value(keys + [key], value[key], flattened)
        elif isinstance(value, list):
            for idx, v in enumerate(value):
                process_value(keys + [str(idx)], v, flattened)
        else:
            flattened['__'.join(keys)] = value

    flattened = {}
    for key in json.keys():
        process_value([key], json[key], flattened)
    return flattened

이 문제를 해결하는 간단한 방법:

json_to_csv.py와 같은 새 Python 파일을 만듭니다.

다음 코드 추가:

import csv, json, sys
#if you are not using utf-8 files, remove the next line
sys.setdefaultencoding("UTF-8")
#check if you pass the input file and output file
if sys.argv[1] is not None and sys.argv[2] is not None:

    fileInput = sys.argv[1]
    fileOutput = sys.argv[2]

    inputFile = open(fileInput)
    outputFile = open(fileOutput, 'w')
    data = json.load(inputFile)
    inputFile.close()

    output = csv.writer(outputFile)

    output.writerow(data[0].keys())  # header row

    for row in data:
        output.writerow(row.values())

이 코드를 추가한 후 파일을 저장하고 단말기에서 실행합니다.

python json_to_csv.py 입력.txt output.csv

이게 도움이 됐으면 좋겠어요.

씨야!

이거 드셔보세요

import csv, json, sys

input = open(sys.argv[1])
data = json.load(input)
input.close()

output = csv.writer(sys.stdout)

output.writerow(data[0].keys())  # header row

for item in data:
    output.writerow(item.values())

이 코드는 지정된 json 파일에 대해 작동합니다.

# -*- coding: utf-8 -*-
"""
Created on Mon Jun 17 20:35:35 2019
author: Ram
"""

import json
import csv

with open("file1.json") as file:
    data = json.load(file)



# create the csv writer object
pt_data1 = open('pt_data1.csv', 'w')
csvwriter = csv.writer(pt_data1)

count = 0

for pt in data:

      if count == 0:

             header = pt.keys()

             csvwriter.writerow(header)

             count += 1

      csvwriter.writerow(pt.values())

pt_data1.close()

이것은 비교적 잘 작동한다.csv 파일에 쓰도록 json을 평탄화합니다.네스트된 요소가 관리됩니다. : )

파이썬 3용입니다.

import json

o = json.loads('your json string') # Be careful, o must be a list, each of its objects will make a line of the csv.

def flatten(o, k='/'):
    global l, c_line
    if isinstance(o, dict):
        for key, value in o.items():
            flatten(value, k + '/' + key)
    elif isinstance(o, list):
        for ov in o:
            flatten(ov, '')
    elif isinstance(o, str):
        o = o.replace('\r',' ').replace('\n',' ').replace(';', ',')
        if not k in l:
            l[k]={}
        l[k][c_line]=o

def render_csv(l):
    ftime = True

    for i in range(100): #len(l[list(l.keys())[0]])
        for k in l:
            if ftime :
                print('%s;' % k, end='')
                continue
            v = l[k]
            try:
                print('%s;' % v[i], end='')
            except:
                print(';', end='')
        print()
        ftime = False
        i = 0

def json_to_csv(object_list):
    global l, c_line
    l = {}
    c_line = 0
    for ov in object_list : # Assumes json is a list of objects
        flatten(ov)
        c_line += 1
    render_csv(l)

json_to_csv(o)

즐거운 시간 되세요.

리스트가 내장된 JSON을 지원하도록 Alex McGail의 답변 수정

    def flattenjson(self, mp, delim="|"):
            ret = []
            if isinstance(mp, dict):
                    for k in mp.keys():
                            csvs = self.flattenjson(mp[k], delim)
                            for csv in csvs:
                                    ret.append(k + delim + csv)
            elif isinstance(mp, list):
                    for k in mp:
                            csvs = self.flattenjson(k, delim)
                            for csv in csvs:
                                    ret.append(csv)
            else:
                    ret.append(mp)

            return ret

감사합니다!

import json,csv
t=''
t=(type('a'))
json_data = []
data = None
write_header = True
item_keys = []
try:
with open('kk.json') as json_file:
    json_data = json_file.read()

    data = json.loads(json_data)
except Exception as e:
    print( e)

with open('bar.csv', 'at') as csv_file:
    writer = csv.writer(csv_file)#, quoting=csv.QUOTE_MINIMAL)
    for item in data:
        item_values = []
        for key in item:
            if write_header:
                item_keys.append(key)
            value = item.get(key, '')
            if (type(value)==t):
                item_values.append(value.encode('utf-8'))
            else:
                item_values.append(value)
        if write_header:
            writer.writerow(item_keys)
            write_header = False
        writer.writerow(item_values)

json 형식 파일을 csv 형식 파일로 변환하기 위한 다음 예를 고려해 보겠습니다.

{
 "item_data" : [
      {
        "item": "10023456",
        "class": "100",
        "subclass": "123"
      }
      ]
}

다음 코드는 json 파일( data3.json )을 csv 파일( data3.csv )로 변환합니다.

import json
import csv
with open("/Users/Desktop/json/data3.json") as file:
    data = json.load(file)
    file.close()
    print(data)

fname = "/Users/Desktop/json/data3.csv"

with open(fname, "w", newline='') as file:
    csv_file = csv.writer(file)
    csv_file.writerow(['dept',
                       'class',
                       'subclass'])
    for item in data["item_data"]:
         csv_file.writerow([item.get('item_data').get('dept'),
                            item.get('item_data').get('class'),
                            item.get('item_data').get('subclass')])

위의 코드는 로컬로 설치된 pycharm에서 실행되어 json 파일을 csv 파일로 변환했습니다.이것이 파일 변환에 도움이 되기를 바랍니다.

이것은 @MikeRepass의 답변을 수정한 것입니다.이 버전은 CSV를 파일에 쓰고 Python 2와 Python 3 모두에서 작동합니다.

import csv,json
input_file="data.json"
output_file="data.csv"
with open(input_file) as f:
    content=json.load(f)
try:
    context=open(output_file,'w',newline='') # Python 3
except TypeError:
    context=open(output_file,'wb') # Python 2
with context as file:
    writer=csv.writer(file)
    writer.writerow(content[0].keys()) # header row
    for row in content:
        writer.writerow(row.values())

데이터는 사전 형식으로 표시되므로 실제로 csv를 사용해야 합니다.실제로 적절한 헤더 정보를 가진 행을 출력하려면 , DictWriter()이것에 의해, 변환을 어느 정도 간단하게 처리할 수 있게 됩니다.그 후 fieldnames 파라미터에 의해 순서가 올바르게 설정되며 헤더로서의 첫 번째 행의 출력에서는 나중에 CSV에 의해 읽혀지고 처리됩니다.딕트 리더().

예를 들어 Mike Repass는

output = csv.writer(sys.stdout)

output.writerow(data[0].keys())  # header row

for row in data:
  output.writerow(row.values())

그러나 초기 설정을 출력 = csv로 변경하기만 하면 됩니다.DictWriter(파일 설정, 필드 이름=data[0]).키())

사전에서 요소의 순서가 정의되어 있지 않기 때문에 필드 이름 항목을 명시적으로 작성해야 할 수 있습니다.그렇게 하면 라이터우가 작동하게 됩니다.기입은, 원래의 그림과 같이 동작합니다.

유감스럽게도 나는 놀라운 @Alex McGail의 답변에 작은 기여를 할 만한 평판이 없다.Python3를 사용하고 있었는데 @Alexis R 코멘트에 이어 맵을 목록으로 변환해야 했습니다.

또한 csv 라이터가 파일에 CR을 추가하고 있는 것을 발견했습니다(csv 파일 내부에 데이터가 있는 각 행에 빈 줄이 있습니다).@Jason R을 따르는 솔루션은 매우 쉬웠습니다. 스레드에 대한 Coombs의 답변: Python의 CSV에 캐리지 리턴 추가

csv.writer에 lineterminator='\n' 매개 변수를 추가하기만 하면 됩니다.다음과 같습니다.csv_w = csv.writer( out_file, lineterminator='\n' )

이 코드를 사용하여 json 파일을 csv 파일로 변환할 수 있습니다. 파일을 읽은 후 개체를 panda 데이터 프레임으로 변환한 후 CSV 파일로 저장합니다.

import os
import pandas as pd
import json
import numpy as np

data = []
os.chdir('D:\\Your_directory\\folder')
with open('file_name.json', encoding="utf8") as data_file:    
     for line in data_file:
        data.append(json.loads(line))

dataframe = pd.DataFrame(data)        
## Saving the dataframe to a csv file
dataframe.to_csv("filename.csv", encoding='utf-8',index= False)

저는 여러 가지 제안을 해 보았습니다(또한 Panda는 JSON을 올바르게 정규화하지 않았습니다).하지만 JSON 데이터를 올바르게 해석하고 있는 것은 Max Berman의 것입니다.

각 행에 대해 새로운 열을 만들지 않도록 개선사항을 작성하여 해석 시 기존 열에 넣습니다.또한 데이터가 하나만 있는 경우 값을 문자열로 저장하고 해당 열에 대한 값이 더 있으면 목록을 만드는 효과도 있습니다.

입력용으로 input.json 파일을 가져와 output.csv를 출력합니다.

import json
import pandas as pd

def flatten_json(json):
    def process_value(keys, value, flattened):
        if isinstance(value, dict):
            for key in value.keys():
                process_value(keys + [key], value[key], flattened)
        elif isinstance(value, list):
            for idx, v in enumerate(value):
                process_value(keys, v, flattened)
                # process_value(keys + [str(idx)], v, flattened)
        else:
            key1 = '__'.join(keys)
            if not flattened.get(key1) is None:
                if isinstance(flattened[key1], list):
                    flattened[key1] = flattened[key1] + [value]
                else:
                    flattened[key1] = [flattened[key1]] + [value]
            else:
                flattened[key1] = value

    flattened = {}
    for key in json.keys():
        k = key
        # print("Key: " + k)
        process_value([key], json[key], flattened)
    return flattened

try:
    f = open("input.json", "r")
except:
    pass
y = json.loads(f.read())
flat = flatten_json(y)
text = json.dumps(flat)
df = pd.read_json(text)
df.to_csv('output.csv', index=False, encoding='utf-8')

파티에 늦을지도 모르지만, 비슷한 문제에 대처해 본 적이 있다고 생각합니다.나는 이렇게 생긴 json 파일을 가지고 있었다.

JSON 파일 구조

저는 이 json 파일에서 몇 개의 키/값을 추출하고 싶을 뿐입니다.그래서 나는 그것을 추출하기 위해 다음과 같은 코드를 작성했다.

    """json_to_csv.py
    This script reads n numbers of json files present in a folder and then extract certain data from each file and write in a csv file.
    The folder contains the python script i.e. json_to_csv.py, output.csv and another folder descriptions containing all the json files.
"""

import os
import json
import csv


def get_list_of_json_files():
    """Returns the list of filenames of all the Json files present in the folder
    Parameter
    ---------
    directory : str
        'descriptions' in this case
    Returns
    -------
    list_of_files: list
        List of the filenames of all the json files
    """

    list_of_files = os.listdir('descriptions')  # creates list of all the files in the folder

    return list_of_files


def create_list_from_json(jsonfile):
    """Returns a list of the extracted items from json file in the same order we need it.
    Parameter
    _________
    jsonfile : json
        The json file containing the data
    Returns
    -------
    one_sample_list : list
        The list of the extracted items needed for the final csv
    """

    with open(jsonfile) as f:
        data = json.load(f)

    data_list = []  # create an empty list

    # append the items to the list in the same order.
    data_list.append(data['_id'])
    data_list.append(data['_modelType'])
    data_list.append(data['creator']['_id'])
    data_list.append(data['creator']['name'])
    data_list.append(data['dataset']['_accessLevel'])
    data_list.append(data['dataset']['_id'])
    data_list.append(data['dataset']['description'])
    data_list.append(data['dataset']['name'])
    data_list.append(data['meta']['acquisition']['image_type'])
    data_list.append(data['meta']['acquisition']['pixelsX'])
    data_list.append(data['meta']['acquisition']['pixelsY'])
    data_list.append(data['meta']['clinical']['age_approx'])
    data_list.append(data['meta']['clinical']['benign_malignant'])
    data_list.append(data['meta']['clinical']['diagnosis'])
    data_list.append(data['meta']['clinical']['diagnosis_confirm_type'])
    data_list.append(data['meta']['clinical']['melanocytic'])
    data_list.append(data['meta']['clinical']['sex'])
    data_list.append(data['meta']['unstructured']['diagnosis'])
    # In few json files, the race was not there so using KeyError exception to add '' at the place
    try:
        data_list.append(data['meta']['unstructured']['race'])
    except KeyError:
        data_list.append("")  # will add an empty string in case race is not there.
    data_list.append(data['name'])

    return data_list


def write_csv():
    """Creates the desired csv file
    Parameters
    __________
    list_of_files : file
        The list created by get_list_of_json_files() method
    result.csv : csv
        The csv file containing the header only
    Returns
    _______
    result.csv : csv
        The desired csv file
    """

    list_of_files = get_list_of_json_files()
    for file in list_of_files:
        row = create_list_from_json(f'descriptions/{file}')  # create the row to be added to csv for each file (json-file)
        with open('output.csv', 'a') as c:
            writer = csv.writer(c)
            writer.writerow(row)
        c.close()


if __name__ == '__main__':
    write_csv()

이게 도움이 됐으면 좋겠어요.이 코드가 어떻게 동작하는지에 대한 자세한 내용은 여기를 참조하십시오.

언급URL : https://stackoverflow.com/questions/1871524/how-can-i-convert-json-to-csv

반응형