我正在为学校的编程逻辑入门课程开发一个项目,我们从 .txt 文件中读取信息,将其重新格式化为 JSON 格式,然后将该 JSON 格式写入新的 .txt 文件,同时打印JSON 格式的数据显示到屏幕上。
我遇到一个问题,我的 JSON 键值对在不需要引号的数据类型上添加引号,例如整数和布尔值。
def main():
runtimeManager = RuntimeManager()
jsonResult = runtimeManager.run()
outputFileName=runtimeManager.outputFilename
print(jsonResult)
print("\nOutput written to " +outputFileName+ ".")
class RuntimeManager:
def run(self):
## Gather required member variables
self.getUserInputFileName()
self.getUserOutputFileName()
##Grabbing user file and extracting the CSV
with open(self.inputFilename) as inputFile:
jsonResult = CsvToJson(inputFile.readlines()).transformCsvToJson()
with open(self.outputFilename, "w") as outputFile:
outputFile.write(jsonResult)
return jsonResult
def getUserInputFileName(self):
## Prompt User for
self.inputFilename = input("Enter the filename: ").strip()
def getUserOutputFileName(self):
self.outputFilename = input("Enter the OUTPUT filename: ").strip()
class CsvToJson():
def __init__(self, csv):
self.csv = csv
self.headers = csv[0].strip()
self.data = csv[1:]
def transformCsvToJson(self):
jsonResult = "{"
for i in range(0, len(self.data)):
if (i != 0):
jsonResult = jsonResult + "\n,"
jsonResult = jsonResult + "\"" + str(i+1) + "\":" + self.createJsonObject(self.headers, self.data[i])
return jsonResult + "\n}"
def createJsonObject(self, headers, csvRow):
csvKeyArray = headers.split(",")
csvValueArray = csvRow.strip().split(",")
jsonObject = "{"
for i in range(0, len(csvKeyArray)):
jsonField = ""
if (i != 0):
jsonField = ","
jsonField = jsonField + "\"" + str(csvKeyArray[i]) + "\":" + self.getValueDataType(csvValueArray[i])
jsonObject = jsonObject + jsonField
return jsonObject + "}"
def getValueDataType(self, value):
if (type(value) == int):
value = str(value)
elif (type(value) == str):
value = "\"" + value + "\""
elif (type(value) == bool):
if (value):
value = "true"
else:
value = "false"
elif (type(value) == null):
value = "null"
else:
value = "ERROR"
return value
if (__name__ == "__main__"):
main()
我已将程序和行号放在这里。我的作业规定不允许我们使用 python 内置的 JSON 模块。
我遇到的问题是我的 JSON 格式如下所示:
{“1”:{“姓氏”:“小黄人”,“名字”:“鲍勃”,“首选名称”:“鲍勃”,“首选代词”:“他/他”,“SF ID#” :“2211-4456”,“程序代码”:“3504”,“电话”:“910-432-8765”,“电子邮件”:“[电子邮件受保护]”}
它应该看起来像这样:
{“1”:{“姓氏”:“小黄人”,“名字”:“鲍勃”,“首选名称”:“鲍勃”,“首选代词”:“他/他”,“SF ID #” :“2211-4456”,“程序代码”:3504,“电话”:“910-432-8765”,“电子邮件”:“[电子邮件受保护]”}
程序代码:3504键值对中的代码上没有引号,我不明白为什么要在其上放置引号。
示例输入文件内容如下所示:
Last Name,First Name,Preferred Name,Preferred Pronoun,SF ID #,Program Code,Phone,Email
Minion,Bob,Bob,he/him,2211-4456,3504,910-432-8765,[email protected]
Nichols,James,James,,1234-5678,3651,352-395-5220,[email protected]
Person,Punny,,,9999-1111,3840,352-123-4567,[email protected]
Person,Punny2,,,9999-1112,3841,352-123-6792,[email protected]
Person,Punny3,,,9999-1113,3842,352-123-3420,[email protected]
Smart,Maxwell,Max,,9922-4029,3650,310-2910,[email protected]
Tree,Groot,Groot,,1122-3344,3624,361-1234-5678,[email protected]
这是一个如何从您提供的输入生成有效 json 的示例(但要注意:有很多警告和快捷方式,如果不使用
csv
/json
模块,将很难涵盖所有情况和输入) :
tpl = """\
"{}": {{"Last Name":{},"First Name":{},"Preferred Name":{},"Preferred Pronoun":{},"SF ID #":{},"Program Code":{},"Phone":{},"Email":{}}}"""
def format_val(val):
if val == "":
return "null"
elif isinstance(val, str):
return f'"{val}"'
elif isinstance(val, (int, float)):
return val
elif isinstance(val, bool):
return "true" if val else "false"
raise ValueError(f"Unknown value type {val}")
all_rows = []
with open("out.txt", "r") as f_in:
for line in map(str.strip, f_in):
if f_in == "":
continue
row = list(map(str.strip, line.split(",")))
all_rows.append(row)
final_json = []
for i, row in enumerate(all_rows[1:], 1):
row[5] = int(row[5])
final_json.append(tpl.format(i, *map(format_val, row)))
final_json = "{" + ",\n".join(final_json) + "}"
print(final_json)
打印:
{"1": {"Last Name":"Minion","First Name":"Bob","Preferred Name":"Bob","Preferred Pronoun":"he/him","SF ID #":"2211-4456","Program Code":3504,"Phone":"910-432-8765","Email":"[email protected]"},
"2": {"Last Name":"Nichols","First Name":"James","Preferred Name":"James","Preferred Pronoun":null,"SF ID #":"1234-5678","Program Code":3651,"Phone":"352-395-5220","Email":"[email protected]"},
"3": {"Last Name":"Person","First Name":"Punny","Preferred Name":null,"Preferred Pronoun":null,"SF ID #":"9999-1111","Program Code":3840,"Phone":"352-123-4567","Email":"[email protected]"},
"4": {"Last Name":"Person","First Name":"Punny2","Preferred Name":null,"Preferred Pronoun":null,"SF ID #":"9999-1112","Program Code":3841,"Phone":"352-123-6792","Email":"[email protected]"},
"5": {"Last Name":"Person","First Name":"Punny3","Preferred Name":null,"Preferred Pronoun":null,"SF ID #":"9999-1113","Program Code":3842,"Phone":"352-123-3420","Email":"[email protected]"},
"6": {"Last Name":"Smart","First Name":"Maxwell","Preferred Name":"Max","Preferred Pronoun":null,"SF ID #":"9922-4029","Program Code":3650,"Phone":"310-2910","Email":"[email protected]"},
"7": {"Last Name":"Tree","First Name":"Groot","Preferred Name":"Groot","Preferred Pronoun":null,"SF ID #":"1122-3344","Program Code":3624,"Phone":"361-1234-5678","Email":"[email protected]"}}