我想将包含数据的CSV文件转换为JSON格式,以将其导入其他软件。
我对Python如何处理JSON数据有疑问。
这是CSV文件的样子:
Date;Message;login
29/01/2019 15:38:55;Login successfull;user1
29/01/2019 15:38:44;Logout;user1
29/01/2019 15:31:12;Login successfull;user1
这是我的代码:
#-*- coding: UTF-8 -*-
from collections
import namedtuple
import csv
import json
import hashlib
import datetime
import os
headers = namedtuple ("Headers", "Date, Message, Login")
csv_file_name = 'test.csv'
json_file_name = 'output.json'
json_data = []
json_line = {}
if (os.path.lexists(json_file_name)):
os.remove(json_file_name)
json_file = open (json_file_name,'w')
with open(csv_file_name, encoding="UTF-8", newline='') as csvfile:
next(csvfile)
csv_data = csv.reader(csvfile, delimiter=';')
for header in map(headers._make, csv_data):
logDatetime = datetime.datetime.strptime(header.Date, '%d/%m/%Y %H:%M:%S')
Message = header.Message
login = hashlib.sha512(bytes(header.Login, 'UTF-8')).hexdigest()
json_line["Date"] = logDatetime.strftime('%d-%m-%Y %H:%M:%S')
json_line["Message"] = Message
json_line["Login"] = login
json_data.append(json_line)
with open (json_file_name,'w') as output :
json.dump(json_data, output, indent=4)
output.write('\n')
这是代码生成的数据结构:
[
{
"Date": "29-01-2019 15:31:12",
"Message": "Login successfull",
"Login": "9ec62c20118ff506dac139ec30a521d12b9883e55da92b7d9adeefe09ed4e0bd152e2a099339871424263784f8103391f83b781c432f45eccb03e18e28060d2f"
},
{
"Date": "29-01-2019 15:31:12",
"Message": "Login successfull",
"Login": "9ec62c20118ff506dac139ec30a521d12b9883e55da92b7d9adeefe09ed4e0bd152e2a099339871424263784f8103391f83b781c432f45eccb03e18e28060d2f"
},
{
"Date": "29-01-2019 15:31:12",
"Message": "Login successfull",
"Login": "9ec62c20118ff506dac139ec30a521d12b9883e55da92b7d9adeefe09ed4e0bd152e2a099339871424263784f8103391f83b781c432f45eccb03e18e28060d2f"
} ]
我不知道为什么我的代码用新的覆盖了JSON数据中的先前条目。 如果有人可以向我解释这一点,我将不胜感激。
答案 0 :(得分:1)
会发生什么:
dict
是可变对象。您对csv文件中的每一行使用相同的dict,然后将该单个对象多次附加到列表中。最后,列表在该唯一对象上具有多个引用,该引用包含最后一行的值
如何修复:
简单:为每行创建一个新字典:
...
json_data = []
if (os.path.lexists(json_file_name)):
os.remove(json_file_name)
json_file = open (json_file_name,'w')
with open(csv_file_name, encoding="UTF-8", newline='') as csvfile:
next(csvfile)
csv_data = csv.reader(csvfile, delimiter=';')
for header in map(headers._make, csv_data):
json_line = {}
logDatetime = datetime.datetime.strptime(header.Date, '%d/%m/%Y %H:%M:%S')
...
答案 1 :(得分:0)
假设您在output.json中存在一些数据 如果是这种情况,首先您需要读取该文件并将数据附加到列表中
json_data
然后保存文件