Необходимо переместить полную запись в новый файл json, если какое-либо значение равно нулю/пустой строке, используя python

#python #json #pandas

Вопрос:

Я пытаюсь переместить полную запись в файл json, если какое-либо значение для этой записи является пустой строкой/нулем, используя python. Как я уже упоминал в своих входных данных в первой записи first_name и org_names имеет пустую строку, чтобы переместить эту полную запись в файл ошибок(формат json), необходимо разработать таким образом, чтобы он мог обрабатывать любое количество столбцов

Код Пробовал

 import pandas as pd

df = pd.read_json("Input_Files/find_error_record.json")
leng = len(df)
i = 0

for i in range(leng):
    for key in df:
        print(key, ":", df[key])
 

Входной файл

 [
   {
      "parsed_address":[
         {
            "line":"jhxyzf"
         }
      ],
      "email":[
         "sanjak@tsp.ece.mcgill.ca"
      ],
      "first_name":"",
      "last_name":"",
      "org_names":[
         ""
      ]
   },
   {
      "parsed_address":[
         {
            "line":"wxy"
         }
      ],
      "email":[
         "javier.bargas@unibas.ch"
      ],
      "first_name":"javier a",
      "last_name":"bargasavila",
      "org_names":[
         "a",
         "bc"
      ]
   },
   {
      "parsed_address":[
         {
            "line":"united states"
         }
      ],
      "email":[
         "ramona.bere@gmail.com"
      ],
      "first_name":"ramona c silvestru",
      "last_name":"bere",
      "org_names":[
         "ase bucharest university of economic studies"
      ]
   }
]
 

Файл ошибок:

 [
   {
      "first_name":"",
      "last_name":"Gupta",
      "org_names":[
         ""
      ]
   },
   {   
      "first_name":"",
      "last_name":"bere",
      "org_names":[
         "ase bucharest university of economic studies"
      ]
   }
]
 

Выходной файл:

 [
   {
      "first_name":"javier a",
      "last_name":"bargasavila",
      "org_names":[
         "a",
         "bc"
      ]
   }
]
 

Ответ №1:

Вы можете попробовать это:

 import json


with open('input.json', 'rb') as fp:
    jsondata = json.load(fp)

output_data = []
for data in jsondata:
    if all(data.values()):
        output_data.append(data)

error_data = []
for data in jsondata:
    if not all(data.values()):
        error_data.append(data)

with open('output.json', 'w', encoding='utf-8') as f:
    json.dump(output_data, f, ensure_ascii=False, indent=4)

with open('error.json', 'w', encoding='utf-8') as f:
    json.dump(error_data, f, ensure_ascii=False, indent=4)

 

ввод.json

 [
   {
      "parsed_address":[
         {
            "line":"jhxyzf"
         }
      ],
      "email":[
         "sanjak@tsp.ece.mcgill.ca"
      ],
      "first_name":"",
      "last_name":"",
      "org_names":[
         ""
      ]
   },
   {
      "parsed_address":[
         {
            "line":"wxy"
         }
      ],
      "email":[
         "javier.bargas@unibas.ch"
      ],
      "first_name":"javier a",
      "last_name":"bargasavila",
      "org_names":[
         "a",
         "bc"
      ]
   },
   {
      "parsed_address":[
         {
            "line":"united states"
         }
      ],
      "email":[
         "ramona.bere@gmail.com"
      ],
      "first_name":"ramona c silvestru",
      "last_name":"bere",
      "org_names":[
         "ase bucharest university of economic studies"
      ]
   }
]
 

вывод.json

 [
    {
        "parsed_address": [
            {
                "line": "wxy"
            }
        ],
        "email": [
            "javier.bargas@unibas.ch"
        ],
        "first_name": "javier a",
        "last_name": "bargasavila",
        "org_names": [
            "a",
            "bc"
        ]
    },
    {
        "parsed_address": [
            {
                "line": "united states"
            }
        ],
        "email": [
            "ramona.bere@gmail.com"
        ],
        "first_name": "ramona c silvestru",
        "last_name": "bere",
        "org_names": [
            "ase bucharest university of economic studies"
        ]
    }
]
 

ошибка.json

 [
    {
        "parsed_address": [
            {
                "line": "jhxyzf"
            }
        ],
        "email": [
            "sanjak@tsp.ece.mcgill.ca"
        ],
        "first_name": "",
        "last_name": "",
        "org_names": [
            ""
        ]
    }
]
 

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

1. с открытым(‘Input_Files/find_error_record.json’, ‘rb’) как fp: jsondata = json.load(fp) для dict в jsondata: для ключа значение в элементах dict(): output_data = [obj для obj в jsondata, если obj[ключ] != «»] печать(output_data)

2. Я попробовал приведенный выше код, но вывод неверен.

3. Как видите, это работает на меня. Не могли бы вы, пожалуйста, добавить код, который вы пробовали?

4. Почему бы вам не попробовать мой код и не сообщить мне, работает он или нет?

5. Я не умею жестко кодировать. Если существует более 10 столбцов, не рекомендуется использовать этот код.

Ответ №2:

Мы можем извлечь файл ошибки и файл outfile в формате json, а затем изменить его на фрейм данных.

 import pandas as pd
import json
  

f = open('Input_Files/find_error_record.json',) 
data = json.load(f)  
f.close()

### Output File:
empty_string = ""
Output_File_json = [x for x in data if x["first_name"] not in [empty_string]]
print(Output_File_json)
df_Output_File = pd.json_normalize(Output_File_json)
print(df_Output_File)


### error_file
empty_string = ""
error_file_json = [x for x in data if x["first_name"] in [empty_string]]
print(error_file_json)
df_error_file = pd.json_normalize(error_file_json)
print(df_error_file)


 

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

1. Привет, спасибо за ответ, но он будет жестко закодирован, и если у нас будет больше столбцов, то код не будет гибким