python 列表中添加字典元素值覆盖

python 列表中添加字典元素 值覆盖


今天在列表中循环添加元素,遇到了一个问题,后面修改字典元素的值时,之前添加到列表中的字典元素的值也被更改了。
代码如下
代码主要是将一个jl文件转换为csv文件
jl 文件的格式如下
33.png

# coding: utf-8
import csv
import json
import sys
import codecs
from pprint import pprint
from copy import deepcopy

input_file = "junodata.jl"
output_file = "track_data_trimmed.csv"

headers = ["id", "release_artist", "release_cat_num", "release_date",
            "release_genre", "release_label", "release_title",
            "track_name", "track_url"]

index_id = 1
with open(input_file, 'r') as f_jl:
    with open(output_file, 'w+') as csv_f:
        f_csv = csv.DictWriter(csv_f, headers)
        f_csv.writeheader()
        for jl_data in f_jl:
            json_data = json.loads(jl_data)
            # 数据转换
            data = dict()
            row_data = list()
            row_data.clear()
            data['release_artist'] = json_data['artist']
            data['release_cat_num'] = json_data['catalog_number']
            data['release_date'] = json_data['release_date']
            data['release_genre'] = json_data['genre']
            data['release_label'] = json_data['label']
            data['release_title'] = json_data['title']
            for track_infor in json_data['tracks']:
                data['id'] = index_id
                data['track_name'] = track_infor[0]
                data['track_url'] = track_infor[1]
                row_data.append(data)
                index_id += 1
            # 写入CSV
            f_csv.writerows(row_data)
print("Done!")

运行结果如下
1.png

查阅资料
list增加字典元素覆盖问题
Python中向列表添加字典元素的问题
这里主要是变量引用的问题,添加深度复制,解决问题。

# coding: utf-8
import csv
import json
import sys
import codecs
from pprint import pprint
from copy import deepcopy

input_file = "junodata.jl"
output_file = "track_data_trimmed.csv"

headers = ["id", "release_artist", "release_cat_num", "release_date",
            "release_genre", "release_label", "release_title",
            "track_name", "track_url"]

index_id = 1
with open(input_file, 'r') as f_jl:
    with open(output_file, 'w+') as csv_f:
        f_csv = csv.DictWriter(csv_f, headers)
        f_csv.writeheader()
        for jl_data in f_jl:
            json_data = json.loads(jl_data)
            # 数据转换
            data = dict()
            row_data = list()
            row_data.clear()
            data['release_artist'] = json_data['artist']
            data['release_cat_num'] = json_data['catalog_number']
            data['release_date'] = json_data['release_date']
            data['release_genre'] = json_data['genre']
            data['release_label'] = json_data['label']
            data['release_title'] = json_data['title']
            for track_infor in json_data['tracks']:
                data['id'] = index_id
                data['track_name'] = track_infor[0]
                data['track_url'] = track_infor[1]
                row_data.append(data)
                index_id += 1
                # 需要深度复制 否则下次更改时会连之前的列表中的值一起更改
                data = deepcopy(data)
            # 写入CSV
            f_csv.writerows(row_data)
print("Done!")

22.png

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值