派森 #P133. json格式转存csv文件

描述

文件movie.in中以json格式存放了一些电影数据,你可以通过json库很容易将数据读入成Python内部对象,请观察一下代码的运行结果。

import json
file_name = "movie_inf.in"
with open(file_name,'rt',encoding='utf-8') as fid:
    txt = json.load(fid)
    print(txt)

现在要求请将该文件转成csv格式(utf-8编码),存储至movie.out文件。

格式

输入:movie_inf.in

[
    {
        "片名": "肖申克的救赎",
        "上映年份": "1994",
        "评分": "9.7",
        "评价人数": "2317937",
        "导演": "弗兰克·德拉邦特",
        "编剧": "弗兰克·德拉邦特 / 斯蒂芬·金",
        "主演": "蒂姆·罗宾斯 / 摩根·弗里曼 / 鲍勃·冈顿 / 威廉姆·赛德勒 / 克兰西·布朗 / 吉尔·贝罗斯 / 马克·罗斯顿 / 詹姆斯·惠特摩 / 杰弗里·德曼 / 拉里·布兰登伯格 / 尼尔·吉恩托利 / 布赖恩·利比 / 大卫·普罗瓦尔 / 约瑟夫·劳格诺 / 祖德·塞克利拉 / 保罗·麦克兰尼 / 芮妮·布莱恩 / 阿方索·弗里曼 / V·J·福斯特 / 弗兰克·梅德拉诺 / 马克·迈尔斯 / 尼尔·萨默斯 / 耐德·巴拉米 / 布赖恩·戴拉特 / 唐·麦克马纳斯",
        "类型": "剧情 / 犯罪",
        "国家/地区": "美国",
        "语言": "英语",
        "时长(分钟)": "142"
    },
    {
        "片名": "霸王别姬",
        "上映年份": "1993",
        "评分": "9.6",
        "评价人数": "1720638",
        "导演": "陈凯歌",
        "编剧": "芦苇 / 李碧华",
        "主演": "张国荣 / 张丰毅 / 巩俐 / 葛优 / 英达 / 蒋雯丽 / 吴大维 / 吕齐 / 雷汉 / 尹治 / 马明威 / 费振翔 / 智一桐 / 李春 / 赵海龙 / 李丹 / 童弟 / 沈慧芬 / 黄斐 / 徐杰",
        "类型": "剧情 / 爱情 / 同性",
        "国家/地区": "中国",
        "语言": "汉语普通话",
        "时长(分钟)": "171"
    },
    {
        "片名": "阿甘正传",
        "上映年份": "1994",
        "评分": "9.5",
        "评价人数": "1743966",
        "导演": "罗伯特·泽米吉斯",
        "编剧": "艾瑞克·罗斯 / 温斯顿·格鲁姆",
        "主演": "汤姆·汉克斯 / 罗宾·怀特 / 加里·西尼斯 / 麦凯尔泰·威廉逊 / 莎莉·菲尔德 / 海利·乔·奥斯蒙 / 迈克尔·康纳·亨弗里斯 / 哈罗德·G·赫瑟姆 / 山姆·安德森 / 伊俄涅·M·特雷奇 / 彼得·道博森 / 希芳·法隆 / 伊丽莎白·汉克斯 / 汉娜·豪尔 / 克里斯托弗·琼斯 / 罗布·兰德里 / 杰森·麦克奎尔 / 桑尼·施罗耶 / 艾德·戴维斯 / 丹尼尔C.斯瑞派克 / 大卫·布里斯宾 / 德博拉·麦克蒂尔 / 艾尔·哈林顿 / 阿非莫·奥米拉 / 约翰·沃德斯塔德 / 迈克尔·伯吉斯 / 埃里克·安德伍德 / 拜伦·明斯 / 斯蒂芬·布吉格沃特 / 约翰·威廉·高尔特 / 希拉里·沙普兰 / 伊莎贝尔·罗斯 / 理查德·达历山德罗 / 迪克·史迪威 / 迈克尔-杰斯 / 杰弗里·布莱克 / 瓦妮莎·罗斯 / 迪克·卡维特 / 马拉·苏查雷特扎 / 乔·阿拉斯奇 / W·本森·泰瑞",
        "类型": "剧情 / 爱情",
        "国家/地区": "美国",
        "语言": "英语",
        "时长(分钟)": "142"
    },
    {
        "片名": "这个杀手不太冷",
        "上映年份": "1994",
        "评分": "9.4",
        "评价人数": "1922740",
        "导演": "吕克·贝松",
        "编剧": "吕克·贝松",
        "主演": "让·雷诺 / 娜塔莉·波特曼 / 加里·奥德曼 / 丹尼·爱罗 / 彼得·阿佩尔 / 迈克尔·巴达鲁科 / 艾伦·格里尼 / 伊丽莎白·瑞根 / 卡尔·马图斯维奇 / 弗兰克·赛格 / 麦温 / 乔治·马丁 / 罗伯特·拉萨多 / 亚当·布斯奇 / 马里奥·托迪斯科 / 萨米·纳塞利",
        "类型": "剧情 / 动作 / 犯罪",
        "国家/地区": "法国",
        "语言": "英语 ",
        "时长(分钟)": "110"
    },
    {
        "片名": "泰坦尼克号",
        "上映年份": "1997",
        "评分": "9.4",
        "评价人数": "1706127",
        "导演": "詹姆斯·卡梅隆",
        "编剧": "詹姆斯·卡梅隆",
        "主演": "莱昂纳多·迪卡普里奥 / 凯特·温丝莱特 / 比利·赞恩 / 凯西·贝茨 / 弗兰西丝·费舍 / 格劳瑞亚·斯图尔特 / 比尔·帕克斯顿 / 伯纳德·希尔 / 大卫·沃纳 / 维克多·加博 / 乔纳森·海德 / 苏茜·爱米斯 / 刘易斯·阿伯内西 / 尼古拉斯·卡斯柯恩 / 阿那托利·萨加洛维奇 / 丹尼·努齐 / 杰森·贝瑞 / 伊万·斯图尔特 / 艾恩·格拉法德 / 乔纳森·菲利普斯 / 马克·林赛·查普曼 / 理查德·格拉翰 / 保罗·布赖特威尔 / 艾瑞克·布里登 / 夏洛特·查顿 / 博纳德·福克斯 / 迈克尔·英塞恩 / 法妮·布雷特 / 马丁·贾维斯 / 罗莎琳·艾尔斯 / 罗切尔·罗斯 / 乔纳森·伊万斯-琼斯 / 西蒙·克雷恩 / 爱德华德·弗莱彻 / 斯科特·安德森 / 马丁·伊斯特 / 克雷格·凯利 / 格雷戈里·库克 / 利亚姆·图伊 / 詹姆斯·兰开斯特 / 艾尔莎·瑞雯 / 卢·帕尔特 / 泰瑞·佛瑞斯塔 / 凯文·德·拉·诺伊",
        "类型": "剧情 / 爱情 / 灾难",
        "国家/地区": "美国",
        "语言": "英语 ",
        "时长(分钟)": "194"
    }
]

movie_inf.out

片名,上映年份,评分,评价人数,导演,编剧,主演,类型,国家/地区,语言,时长(分钟)
肖申克的救赎,1994,9.7,2317937,弗兰克·德拉邦特,弗兰克·德拉邦特 / 斯蒂芬·金,蒂姆·罗宾斯 / 摩根·弗里曼 / 鲍勃·冈顿 / 威廉姆·赛德勒 / 克兰西·布朗 / 吉尔·贝罗斯 / 马克·罗斯顿 / 詹姆斯·惠特摩 / 杰弗里·德曼 / 拉里·布兰登伯格 / 尼尔·吉恩托利 / 布赖恩·利比 / 大卫·普罗瓦尔 / 约瑟夫·劳格诺 / 祖德·塞克利拉 / 保罗·麦克兰尼 / 芮妮·布莱恩 / 阿方索·弗里曼 / V·J·福斯特 / 弗兰克·梅德拉诺 / 马克·迈尔斯 / 尼尔·萨默斯 / 耐德·巴拉米 / 布赖恩·戴拉特 / 唐·麦克马纳斯,剧情 / 犯罪,美国,英语,142
霸王别姬,1993,9.6,1720638,陈凯歌,芦苇 / 李碧华,张国荣 / 张丰毅 / 巩俐 / 葛优 / 英达 / 蒋雯丽 / 吴大维 / 吕齐 / 雷汉 / 尹治 / 马明威 / 费振翔 / 智一桐 / 李春 / 赵海龙 / 李丹 / 童弟 / 沈慧芬 / 黄斐 / 徐杰,剧情 / 爱情 / 同性,中国,汉语普通话,171
阿甘正传,1994,9.5,1743966,罗伯特·泽米吉斯,艾瑞克·罗斯 / 温斯顿·格鲁姆,汤姆·汉克斯 / 罗宾·怀特 / 加里·西尼斯 / 麦凯尔泰·威廉逊 / 莎莉·菲尔德 / 海利·乔·奥斯蒙 / 迈克尔·康纳·亨弗里斯 / 哈罗德·G·赫瑟姆 / 山姆·安德森 / 伊俄涅·M·特雷奇 / 彼得·道博森 / 希芳·法隆 / 伊丽莎白·汉克斯 / 汉娜·豪尔 / 克里斯托弗·琼斯 / 罗布·兰德里 / 杰森·麦克奎尔 / 桑尼·施罗耶 / 艾德·戴维斯 / 丹尼尔C.斯瑞派克 / 大卫·布里斯宾 / 德博拉·麦克蒂尔 / 艾尔·哈林顿 / 阿非莫·奥米拉 / 约翰·沃德斯塔德 / 迈克尔·伯吉斯 / 埃里克·安德伍德 / 拜伦·明斯 / 斯蒂芬·布吉格沃特 / 约翰·威廉·高尔特 / 希拉里·沙普兰 / 伊莎贝尔·罗斯 / 理查德·达历山德罗 / 迪克·史迪威 / 迈克尔-杰斯 / 杰弗里·布莱克 / 瓦妮莎·罗斯 / 迪克·卡维特 / 马拉·苏查雷特扎 / 乔·阿拉斯奇 / W·本森·泰瑞,剧情 / 爱情,美国,英语,142
这个杀手不太冷,1994,9.4,1922740,吕克·贝松,吕克·贝松,让·雷诺 / 娜塔莉·波特曼 / 加里·奥德曼 / 丹尼·爱罗 / 彼得·阿佩尔 / 迈克尔·巴达鲁科 / 艾伦·格里尼 / 伊丽莎白·瑞根 / 卡尔·马图斯维奇 / 弗兰克·赛格 / 麦温 / 乔治·马丁 / 罗伯特·拉萨多 / 亚当·布斯奇 / 马里奥·托迪斯科 / 萨米·纳塞利,剧情 / 动作 / 犯罪,法国,英语 ,110
泰坦尼克号,1997,9.4,1706127,詹姆斯·卡梅隆,詹姆斯·卡梅隆,莱

代码:

import csv
import json
with open('movie_inf.in', 'r',encoding='utf-8') as f:
    data = json.load(f)
header = list(data[0].keys())
with open('movie_inf.out', 'w', newline='',encoding='utf-8') as fi:
    writer = csv.writer(fi)
    writer.writerow(header)
    for row in data:
        writer.writerow(row.values())

代码解析:

  1. import csv:导入CSV模块,用于读写CSV文件。
  2. import json:导入JSON模块,用于处理JSON格式数据。
  3. with open('movie_inf.in', 'r', encoding='utf-8') as f::使用with语句打开名为'movie_inf.in'的文件,以只读模式读取(默认模式为文本模式),并指定编码为UTF-8。将文件对象赋值给变量fwith语句能够自动关闭文件。
  4. data = json.load(f):使用JSON模块的load()函数从文件对象f中加载JSON字符串,将其转换为Python数据类型。将加载后的数据赋值给变量data
  5. header = list(data[0].keys()):获取data列表中第一个字典的所有键(即JSON的字段名),并将其转换为列表。将列表赋值给变量header
  6. with open('movie_inf.out', 'w', newline='', encoding='utf-8') as fi::使用with语句打开名为'movie_inf.out'的文件,以写入模式写入(默认模式为文本模式),并指定编码为UTF-8。newline=''参数用于指定换行符处理方式,为空表示不进行额外的换行符处理。将文件对象赋值给变量fiwith语句能够自动关闭文件。
  7. writer = csv.writer(fi):创建一个CSV写入器对象writer,使用文件对象fi作为输出,用于按行写入数据到CSV文件中。
  8. writer.writerow(header):使用CSV写入器对象writer将列表header写入CSV文件作为表头。
  9. for row in data::遍历列表data中的每个元素,每次将一个字典赋值给变量row
  10. writer.writerow(row.values()):使用CSV写入器对象writer将字典row的所有值(即JSON数据中的字段值)以行的形式写入CSV文件。

猜你喜欢

转载自blog.csdn.net/m0_63501513/article/details/132438547