在python中将数据覆盖到JSON数据结构中

时间:2019-03-26 10:50:00

标签: python json csv

我想将包含数据的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数据中的先前条目。 如果有人可以向我解释这一点,我将不胜感激。

2 个答案:

答案 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

然后保存文件