在从csv文件中读取json后,我向json中添加了一个新字段,如何将值添加到

2024-09-22 15:23:31 发布

您现在位置:Python中文网/ 问答频道 /正文

我刚接触python一周,所以请不要介意我的无知,我正在阅读一个csv文件并从中创建一个json文件,同时我正在添加一个新字段 JerseyNumber到我的字段\u names,由于这个值在csv中不存在,它被存储为null,有没有什么方法可以填充这个字段,所以我的做法是有一个数字列表,例如-

JERSEYNUMBERS = ["1","2","3","4","5","6","7"] 

以及 使用-

"".join(random.sample(JERSEYNUMBERS,2))

但是我找不到方法用json把它放进去,因为使用restval="".join(random.sample(JERSEYNUMBERS,2)不会给出随机值,也不会将相同的值更新到所有的Jersey数字

我的csv到json函数-

def csv_to_json (csv_file_name_str, json_file_name_str):
    try:
        logging.info("converting {} to {}".format(csv_file_name_str, json_file_name_str))
        csv_file = open(csv_file_name_str, "r")
        json_file = open(json_file_name_str, "w")

        field_names = ["Name", "Height", "SoccerExperience", "GuardianName", "JerseyNumber"]
        reader = csv.DictReader(csv_file, field_names, restval="".join(random.sample(JERSEYNUMBERS,2)))
        logging.info("Conversion finish.")
        out = '{\n "Players": [\n\t'+ ',\n\t'.join([json.dumps(row) for row in reader]) + '\n]\n}'
        json_file.write(out)
        return json_file_name_str
    except (OSError, IOError, TypeError) as e:
        logging.error("csv to json conversion failed: Caused by -> {}".format(e))

我的json文件在JerseyNumbers中有空值(这是我的测试数据不是真实的人)-

{
 "Players": [
    {"Name": "Name", "Height": "Height (inches)", "SoccerExperience": "Soccer Experience", "GuardianName": "Guardian Name(s)", "JerseyNumber": null},
    {"Name": "Joe Smith", "Height": "42", "SoccerExperience": "YES", "GuardianName": "Jim and Jan Smith", "JerseyNumber": null},
    {"Name": "Jill Tanner", "Height": "36", "SoccerExperience": "YES", "GuardianName": "Clara Tanner", "JerseyNumber": null},
    {"Name": "Bill Bon", "Height": "43", "SoccerExperience": "YES", "GuardianName": "Sara and Jenny Bon", "JerseyNumber": null},
    {"Name": "Eva Gordon", "Height": "45", "SoccerExperience": "NO", "GuardianName": "Wendy and Mike Gordon", "JerseyNumber": null},
    {"Name": "Matt Gill", "Height": "40", "SoccerExperience": "NO", "GuardianName": "Charles and Sylvia Gill", "JerseyNumber": null},
    {"Name": "Kimmy Stein", "Height": "41", "SoccerExperience": "NO", "GuardianName": "Bill and Hillary Stein", "JerseyNumber": null},
    {"Name": "Sammy Adams", "Height": "45", "SoccerExperience": "NO", "GuardianName": "Jeff Adams", "JerseyNumber": null},
    {"Name": "Karl Saygan", "Height": "42", "SoccerExperience": "YES", "GuardianName": "Heather Bledsoe", "JerseyNumber": null},
    {"Name": "Suzane Greenberg", "Height": "44", "SoccerExperience": "YES", "GuardianName": "Henrietta Dumas", "JerseyNumber": null},
    {"Name": "Sal Dali", "Height": "41", "SoccerExperience": "NO", "GuardianName": "Gala Dali", "JerseyNumber": null},
    {"Name": "Joe Kavalier", "Height": "39", "SoccerExperience": "NO", "GuardianName": "Sam and Elaine Kavalier", "JerseyNumber": null},
    {"Name": "Ben Finkelstein", "Height": "44", "SoccerExperience": "NO", "GuardianName": "Aaron and Jill Finkelstein", "JerseyNumber": null},
    {"Name": "Diego Soto", "Height": "41", "SoccerExperience": "YES", "GuardianName": "Robin and Sarika Soto", "JerseyNumber": null},
    {"Name": "Chloe Alaska", "Height": "47", "SoccerExperience": "NO", "GuardianName": "David and Jamie Alaska", "JerseyNumber": null},
    {"Name": "Arnold Willis", "Height": "43", "SoccerExperience": "NO", "GuardianName": "Claire Willis", "JerseyNumber": null},
    {"Name": "Phillip Helm", "Height": "44", "SoccerExperience": "YES", "GuardianName": "Thomas Helm and Eva Jones", "JerseyNumber": null},
    {"Name": "Les Clay", "Height": "42", "SoccerExperience": "YES", "GuardianName": "Wynonna Brown", "JerseyNumber": null},
    {"Name": "Herschel Krustofski", "Height": "45", "SoccerExperience": "YES", "GuardianName": "Hyman and Rachel Krustofski", "JerseyNumber": null}
]
}

restval-

{
 "Players": [
    {"Name": "Name", "Height": "Height (inches)", "SoccerExperience": "Soccer Experience", "GuardianName": "Guardian Name(s)", "JerseyNumber": "13"},
    {"Name": "Joe Smith", "Height": "42", "SoccerExperience": "YES", "GuardianName": "Jim and Jan Smith", "JerseyNumber": "13"},
    {"Name": "Jill Tanner", "Height": "36", "SoccerExperience": "YES", "GuardianName": "Clara Tanner", "JerseyNumber": "13"},
    {"Name": "Bill Bon", "Height": "43", "SoccerExperience": "YES", "GuardianName": "Sara and Jenny Bon", "JerseyNumber": "13"},
    {"Name": "Eva Gordon", "Height": "45", "SoccerExperience": "NO", "GuardianName": "Wendy and Mike Gordon", "JerseyNumber": "13"},
    {"Name": "Matt Gill", "Height": "40", "SoccerExperience": "NO", "GuardianName": "Charles and Sylvia Gill", "JerseyNumber": "13"},
    {"Name": "Kimmy Stein", "Height": "41", "SoccerExperience": "NO", "GuardianName": "Bill and Hillary Stein", "JerseyNumber": "13"},
    {"Name": "Sammy Adams", "Height": "45", "SoccerExperience": "NO", "GuardianName": "Jeff Adams", "JerseyNumber": "13"},
    {"Name": "Karl Saygan", "Height": "42", "SoccerExperience": "YES", "GuardianName": "Heather Bledsoe", "JerseyNumber": "13"},
    {"Name": "Suzane Greenberg", "Height": "44", "SoccerExperience": "YES", "GuardianName": "Henrietta Dumas", "JerseyNumber": "13"},
    {"Name": "Sal Dali", "Height": "41", "SoccerExperience": "NO", "GuardianName": "Gala Dali", "JerseyNumber": "13"},
    {"Name": "Joe Kavalier", "Height": "39", "SoccerExperience": "NO", "GuardianName": "Sam and Elaine Kavalier", "JerseyNumber": "13"},
    {"Name": "Ben Finkelstein", "Height": "44", "SoccerExperience": "NO", "GuardianName": "Aaron and Jill Finkelstein", "JerseyNumber": "13"},
    {"Name": "Diego Soto", "Height": "41", "SoccerExperience": "YES", "GuardianName": "Robin and Sarika Soto", "JerseyNumber": "13"},
    {"Name": "Chloe Alaska", "Height": "47", "SoccerExperience": "NO", "GuardianName": "David and Jamie Alaska", "JerseyNumber": "13"},
    {"Name": "Arnold Willis", "Height": "43", "SoccerExperience": "NO", "GuardianName": "Claire Willis", "JerseyNumber": "13"},
    {"Name": "Phillip Helm", "Height": "44", "SoccerExperience": "YES", "GuardianName": "Thomas Helm and Eva Jones", "JerseyNumber": "13"},
    {"Name": "Les Clay", "Height": "42", "SoccerExperience": "YES", "GuardianName": "Wynonna Brown", "JerseyNumber": "13"},
    {"Name": "Herschel Krustofski", "Height": "45", "SoccerExperience": "YES", "GuardianName": "Hyman and Rachel Krustofski", "JerseyNumber": "13"}
]
}

Tags: andcsvnonamejsonnullyesfile
2条回答

为了直接回答你的问题,我认为你应该避免使用restval。Restval似乎填充了所有的空值。如果一个玩家的名字是空的,而您使用的是restval,那么这个玩家的名字最终将是一个两位数的数字。这在我们生活的时代可能并不奇怪

我认为你应该在球员身上循环,给他们每个人分配一个值作为他们的球衣号码属性:

import csv
import json
import random

def generate_jersey_number():
    return "".join(random.sample(range(1, 8), 2))

def csv_to_json(csv_file_name_str, json_file_name_str):
    field_names = ["Name", "Height", "SoccerExperience",
                   "GuardianName", "JerseyNumber"]
    # Read the rows of your CSV as dictionaries
    with open(csv_file_name_str, "r") as csv_file:
        reader = csv.DictReader(csv_file, field_names)
        data = {
            'Players': [player for player in reader]
        }
    # Loop over your players, assigning them a jersey number
    for player in data['Players']:
        player['JerseyNumber'] = generate_jersey_number()
    # Dump the entire data structure to JSON
    with open(json_file_name_str, "w") as json_file:
        json.dump(data, json_file)
    return json_file_name_str

可以在代码中包含的简单改进:

  • 使用with将在退出with块时关闭文件,释放文件句柄
  • 仅在需要时获取文件句柄,然后释放它们
  • 不要试图自己设计JSON字符串。而是使用Python数据结构,然后将它们转储到JSON中
  • 全球试捕既不酷也不黑

因此我有了一个突破:),我创建了一个新函数,在将文件发送到应用程序之前加载文件,并添加泽西岛号码

基本上,我是从Players键中获取值(这是一个列表),并在其上循环,将值添加到给定的键中,然后返回一个新的json加载对象

有更有效的方法可以做到这一点,但目前我对python的有限知识只能给我一个出路

def load_json(json_file_name_str):

    try:
        with open(json_file_name_str) as json_file:
            datas = json.load(json_file)
            players = datas["Players"]

            for i in players:
                for key in i:
                    if key=="JerseyNumber":
                        i[key] = "".join(random.sample(JERSEYNUMBERS,2))   
            return datas
    except (TypeError) as e:
        logging.error("Json file loading failed: Caused by -> {}".format(e))

相关问题 更多 >