Напишите CSV-файл из JSON, импортируя только заданные ключи

#python #json #export-to-csv

Вопрос:

У меня есть JSONs, сообщающие о разных значениях, и я хочу импортировать только некоторые ключи в csv. Я попробовал 2 подхода, но оба дают мне некоторые проблемы. Сначала я попробовал это :

  `import os,json
    import glob
    import csv
    
    # Place your JSON data in a directory named 'data/'
    src = "MYPATH"
    data = []
    
    
    json_pattern = os.path.join(src, '*.json')
    # only json
    files = glob.glob(json_pattern, recursive=True)
    
    
    # Loop through files
    for single_file in files:
      with open(single_file, 'r') as f:
        json_file = json.load(f)
      try:
          data.append([
              json_file['name1'],
              json_file['name2'],
              json_file['name3'],
              json_file['name4'],
    
          ])
      except KeyError:
          continue
# Add headers
data.insert(0, ['title_1', 'title_2', 'title_3'])

# Export to CSV.
# Add the date to the file name to avoid overwriting it each time.
csv_filename = 'name.csv'
with open((src   csv_filename), "w", newline="") as f:
    writer = csv.writer(f)
    writer.writerows(data)`
 

Таким образом, к сожалению, если ключ не включен, код полностью пропускает файл, в то время как я хочу, чтобы он пропускал только ключ.
Поэтому я попробовал это, вместо этого:

 import os,json
import glob
import csv

# Place your JSON data in a directory named 'data/'
src = "MY_PATH"
data = []

json_pattern = os.path.join(src, '*.json')
# Change the glob if you want to only look through files with specific names
files = glob.glob(json_pattern, recursive=True)


# Loop through files
col_name = ['name1','name2','name4']
for single_file in files:
  with open(single_file, 'r') as f:
    json_file = json.load(f)
    for key in col_name:
      try:
        data.append([json_file[key]])
      except KeyError:
        continue



# Add headers
data.insert(0, ['title_1', 'title_2', 'title_3'])

# Export to CSV.
# Add the date to the file name to avoid overwriting it each time.
csv_filename = 'name.csv'
with open((src   csv_filename), "w", newline="") as f:
    writer = csv.writer(f)
    writer.writerows(data)
 

Но в этом случае каждое значение представляет собой новую строку в csv, в то время как я хочу, чтобы значение каждого json было в одной строке.

Я не эксперт, и я действительно не знаю, как совместить эти два. Кто-нибудь может мне помочь? Спасибо!

Комментарии:

1. Не могли бы вы, пожалуйста, исправить отступ в вашем первом примере кода?

2. Не могли бы вы показать пример ввода json и ожидаемый csv?

3. К счастью, я нашел свое решение, но в следующий раз я буду более точным!

Ответ №1:

Если я правильно понимаю, что вы пытаетесь сделать, почему бы просто не сделать

 # Loop through files
for single_file in files:
  with open(single_file, 'r') as f:
    json_file = json.load(f)
    data.append([
      json_file.get('name1', ''),
      json_file.get('name2', ''),
      json_file.get('name3', ''),
      json_file.get('name4', '')
    ])
 

С помощью .get() вы можете указать значение по умолчанию в случае, если ключ не найден.