派森 #P128. csv存json格式

描述

编写一个 Python 程序,读取movie.in(csv格式,utf-8编码) 的数据,将数据转成保存到movie.out(接送格式,utf-8编码)文件中。

格式

输入

movie.in文件,测试格式,utf-8编码。

输出

movie.out,json格式,utf-8编码

样例

输入

movie.in

输出

moive.out

输出文件格式

[
    {
        "片名": "肖申克的救赎",
        "上映年份": "1994",
        "评分": "9.7",
        "评价人数": "2317937",
        "导演": "弗兰克·德拉邦特",
        "编剧": "弗兰克·德拉邦特 / 斯蒂芬·金",
        "主演": "蒂姆·罗宾斯 / 摩根·弗里曼 / 鲍勃·冈顿 / 威廉姆·赛德勒 / 克兰西·布朗 / 吉尔·贝罗斯 / 马克·罗斯顿 / 詹姆斯·惠特摩 / 杰弗里·德曼 / 拉里·布兰登伯格 / 尼尔·吉恩托利 / 布赖恩·利比 / 大卫·普罗瓦尔 / 约瑟夫·劳格诺 / 祖德·塞克利拉 / 保罗·麦克兰尼 / 芮妮·布莱恩 / 阿方索·弗里曼 / V·J·福斯特 / 弗兰克·梅德拉诺 / 马克·迈尔斯 / 尼尔·萨默斯 / 耐德·巴拉米 / 布赖恩·戴拉特 / 唐·麦克马纳斯",
        "类型": "剧情 / 犯罪",
        "国家/地区": "美国",
        "语言": "英语",
        "时长(分钟)": "142"
    },
    {
        "片名": "霸王别姬",
        "上映年份": "1993",
        "评分": "9.6",
        "评价人数": "1720638",
        "导演": "陈凯歌",
        "编剧": "芦苇 / 李碧华",
        "主演": "张国荣 / 张丰毅 / 巩俐 / 葛优 / 英达 / 蒋雯丽 / 吴大维 / 吕齐 / 雷汉 / 尹治 / 马明威 / 费振翔 / 智一桐 / 李春 / 赵海龙 / 李丹 / 童弟 / 沈慧芬 / 黄斐 / 徐杰",
        "类型": "剧情 / 爱情 / 同性",
        "国家/地区": "中国",
        "语言": "汉语普通话",
        "时长(分钟)": "171"
    },
    略...
]

代码:

import json
fr = open('movie.in', 'r', encoding='utf-8')
fw = open('movie.out', 'w', encoding='utf-8')
lst = []
for line in fr:
    line = line.replace("\n", "")
    lst.append(line.split(","))
fr.close()
for i in range(1, len(lst)):
    lst[i] = dict(zip(lst[0], lst[i]))
json.dump(lst[1:], fw, indent=4, ensure_ascii=False)
fw.close()

代码解析:

  1. import json:导入JSON模块,用于处理JSON格式的数据。
  2. fr = open('movie.in', 'r', encoding='utf-8'):打开名为'movie.in'的文件,以只读模式读取('r'),使用UTF-8编码(encoding='utf-8'),并将文件对象赋值给变量fr
  3. fw = open('movie.out', 'w', encoding='utf-8'):打开名为'movie.out'的文件,以写入模式('w'),使用UTF-8编码(encoding='utf-8'),并将文件对象赋值给变量fw
  4. lst = []:创建一个空列表lst,用于存储读取的数据。
  5. for line in fr::遍历文件对象fr中的每一行数据,并将每一行赋值给变量line
  6. line = line.replace("\n", ""):使用字符串的replace()方法将每一行末尾的换行符"\n"替换为空字符串"",去除换行符。
  7. lst.append(line.split(",")):使用字符串的split()方法按逗号","将每一行分割成多个部分,并将分割后的结果作为列表添加到lst中。例如,如果一行是"电影1,导演1,主演1",则会变成列表["电影1", "导演1", "主演1"]。
  8. fr.close():关闭文件fr
  9. for i in range(1, len(lst))::遍历列表lst中从索引1开始到最后的部分。这里通过range()函数生成一个范围,从1到len(lst)(列表长度)。
  10. lst[i] = dict(zip(lst[0], lst[i])):使用zip()函数将第一个元素和当前元素对应的部分打包成一个元组,然后使用dict()函数将元组转换为字典。将转换后的字典赋值给列表lst中当前的元素,实现将每一行的数据与第一行(即表头)对应起来,形成键值对的结构。
  11. json.dump(lst[1:], fw, indent=4, ensure_ascii=False):使用JSON模块的dump()函数将列表lst中从索引1开始到最后的部分转换为JSON格式,并将结果写入到文件fw中。参数indent=4指定缩进为4个空格,ensure_ascii=False表示不对非ASCII字符进行转义。
  12. fw.close():关闭文件fw

功能是读取名为'movie.in'的文件中的数据,将其中的每一行按逗号分割成多个部分,并将每一行数据与第一行(表头)对应起来形成键值对的结构。然后将转换后的数据以JSON格式写入到名为'movie.out'的文件中。

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
好的,这是一个积分系统的功能,我们可以用 Python 实现。首先,需要创建一个用户类,包含用户的 ID 和积分信息。然后,我们需要实现一个函数来处理积分变动事件,包括用户的消费和兑换行为。最后,我们需要将有效事件追加到一个 CSV 文件中。下面是代码实现: ```python import csv import random class User: def __init__(self, user_id, points=0): self.user_id = user_id self.points = points def add_points(self, amount): self.points += amount def reduce_points(self, amount): if self.points < amount: return False else: self.points -= amount return True class PointSystem: def __init__(self): self.users = {} self.updates_file = 'updates.csv' def get_user(self, user_id): if user_id in self.users: return self.users[user_id] else: return None def add_user(self, user_id): if user_id not in self.users: self.users[user_id] = User(user_id) def process_event(self): event_type = random.choice(['consume', 'exchange']) user_id = random.randint(1, 10) user = self.get_user(user_id) if not user: return if event_type == 'consume': amount = random.randint(1, 10) user.add_points(amount) with open(self.updates_file, 'a', newline='') as f: writer = csv.writer(f) writer.writerow([user_id, 'consume', amount]) else: amount = random.randint(1, user.points) success = user.reduce_points(amount) if success: with open(self.updates_file, 'a', newline='') as f: writer = csv.writer(f) writer.writerow([user_id, 'exchange', amount]) if __name__ == '__main__': point_system = PointSystem() for i in range(10): point_system.add_user(i+1) for i in range(50): point_system.process_event() ``` 这个程序中,我们首先定义了一个 `User` 类,用于储用户的 ID 和积分信息。然后,我们定义了一个 `PointSystem` 类,用于管理所有的用户和积分变动事件。在 `PointSystem` 类中,我们实现了 `get_user` 和 `add_user` 方法,用于查找或添加用户。然后,我们实现了 `process_event` 方法,用于处理积分变动事件。在这个方法中,我们随机选择一个用户和一个事件类型,并调用相应的用户方法来修改积分。最后,我们将有效事件追加到 CSV 文件中。在 `__main__` 函数中,我们创建了一个 `PointSystem` 对象,并随机生成了 50 个积分变动事件。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值