9、异常和文件

1.编写如下程序

创建一个txt文本文件,来添加数据

a.第一行添加如下内容:

name,age,gender,hobby,motto

b.从第二行开始,每行添加具体用户信息,例如:

yuze,17,男,假正经, I am yours

cainiao,18,女,看书,Lemon is best!

c.具体用户信息要求来自于一个嵌套字典的列表(可自定义这个列表),例如:

person_info = [{"name":"yuze", "age": 18, "gender": "男", "hobby": "", "motto": "hehe"}

 

d.将所有用户信息写入到txt文件中之后,然后再读出

 

2.编写如下程序

有两行数据,存放在txt文件里面:

url:/futureloan/mvc/api/member/register@mobile:18866668888@pwd:123456

url:/futureloan/mvc/api/member/recharge@mobile:18866668888@amount:1000

请利用上课所学知识,把txt里面的两行内容,取出然后返回如下格式的数据:(可定义函数)

[{'url':'/futureloan/mvc/api/member/register','mobile':'18866668888','pwd':'123456'},{'url':'/futureloan/mvc/api/member/recharge','mobile':'18866668888','amount':'1000'}]

 

 

 

 

3.编写如下程序

优化去生鲜超市买橘子程序

a.收银员输入橘子的价格,单位:元/斤

b.收银员输入用户购买橘子的重量,单位:

c.计算并且 输出 付款金额

新需求:

d.使用捕获异常的方式,来处理用户输入无效数据的情况

 

 

 

 

"""
1212-异常和文件
截至:12月17日 18:00 下载讨论内容展示词云
1.编写如下程序
创建一个txt文本文件,来添加数据
a.第一行添加如下内容:
name,age,gender,hobby,motto
b.从第二行开始,每行添加具体用户信息,例如:
yuze,17,男,假正经, I am yours
cainiao,18,女,看书,Lemon is best!
c.具体用户信息要求来自于一个嵌套字典的列表(可自定义这个列表),例如:
person_info = [{"name":"yuze", "age": 18, "gender": "男", "hobby": "", "motto": "hehe"}
d.将所有用户信息写入到txt文件中之后,然后再读出
"""
from review import my_file_path

info = [{"name": "yuze", "age": 17, "gender": "男", "hobby": "假正经", "motto": "I am yours"},
{"name": "cainiao", "age": 18, "gender": "女", "hobby": "看书", "motto": "Lemon is best!"}
]

# 精简答案
def get_value_lines(info):
"""获取每一行的数据"""
# 列表转化成行的字符串形式
# [{},{}] == >name,yuz,...
lines = ""
for person in info:
# {"name": "yuze", "age": 18, "gender": "男", "hobby": "", "motto": "hehe"}
line = []
for e in person.values():
line.append(str(e))

line_str = ",".join(line) + " "
lines += line_str
return lines
# print(get_value_lines(info))
# info.txt 可以使用os.path 来写入内容。


def main():
"""主题逻辑"""
# 可以取出title = info[0].keys() 然后使用",".join(key)

with open("info.txt", "w+") as f:
f.write("name,age,gender,hobby,motto ") # 将标题可以直接写死,注意加一个换行

data = get_value_lines(info) # TODO 调用第一个函数的返回来写入内容
with open("info.txt", "a", encoding="utf-8") as f:
f.write(data)
with open("info.txt", "r", encoding="utf-8") as f:
print(f.read())


# 定义一个嵌套字典的列表存储用户信息。
# 创建一个txt文本文件。使用w模式,文件不存在则创建,然后使用a模式追加文件内容;有中文写入读取使用utf-8编码格式
# 读取用户信息readline();
# 第一行内容为字典的keys(),第二行内容为字典的values()
# 第一行,获取list[0].keys(),提取元素使用join以逗号连接,用write写入文件。

# 下面是自己写的
# 定义一个往txt文档添加内容的函数
def my_append(info):
# 获取标题内容
title = info[0]
# 循环遍历标题内容,使用逗号,join,得到写入的内容
write_1 = (",".join(item for item in title.keys()))
# 创建一个person_info.txt文件,使用写模式,往里面写入标题内容
f = open("person_info.txt", mode="w", encoding="utf-8")
# 写入第一行内容
f.write(write_1)
# 关闭文件
f.close()

# 循环遍历列表中的字典元素
for x in info[:]:
# 循环遍历字典的值内容,使用逗号,join,得到写入的内容;因为值有int类型,需要将其转化成str
append_1 = (",".join(str(item) for item in x.values()))
# 使用追加模式,打开txt文件,追加内容
f1 = open("person_info.txt", mode="a", encoding="utf-8")
# 需要加入换行,否则则会在第一行光标处追加
f1.write(" ")
# 逐行追加内容。
f1.write(append_1)
# 关闭文件
f1.close()


# 定义一个读取文件操作的函数。
def my_read():
# 使用r模式读取txt文件
f2 = open("person_info.txt", mode="r", encoding="utf-8")
# 方式1:读取全部内容,不涉及值使用用read()
print(f2.read())
# 方式2:将读取全部内容。读取出来的列表赋值给变量b
# b = f2.readlines()
# # 循环遍历列表,逐行打印每行内容
# for m in b:
# print(m, end="")
# 循环读取结束关闭文件
f2.close()


"""
2.编写如下程序
有两行数据,存放在txt文件里面:
url:/futureloan/mvc/api/member/register@mobile:18866668888@pwd:123456
url:/futureloan/mvc/api/member/recharge@mobile:18866668888@amount:1000
请利用上课所学知识,把txt里面的两行内容,取出然后返回如下格式的数据:(可定义函数)
[{'url':'/futureloan/mvc/api/member/register','mobile':'18866668888','pwd':'123456'},{'url':'/futureloan/mvc/api/member/recharge','mobile':'18866668888','amount':'1000'}]
"""


# 分析:读取txt文件内容,将读取的内容转换成列表嵌套字典的数据格式。
# 创建一个函数,用来写入用户数据。并读取txt中用户数据内容返回目标格式。
def my_info(info1):
# 先使用w模式创建一个空文件。
f3 = open("info.txt", mode="w", encoding="utf-8")
# 写入空
f3.write("")
# 关闭文件
f3.close()
# 遍历用户的数据,将其写入到空文件中
for i in info1[:]:
# 使用追加模式写入数据
f4 = open("info.txt", mode="a", encoding="utf-8")
f4.write(i)
# 输入换行符
f4.write(" ")
# 关闭文件
f4.close()


# info_1 = ["url:/futureloan/mvc/api/member/register@mobile:18866668888@pwd:123456",
# "url:/futureloan/mvc/api/member/recharge@mobile:18866668888@amount:1000"]
# my_info(info_1)


# 定义数据转换转换函数。
def swap_data():
# 读取已经新建并写入内容的info.txt文件。
f5 = open("info.txt", encoding="utf-8")
a = f5.readlines()
# print(a) # a列表里的元素带有 、@符号、冒号等,需要进行2次分割

# 定义一个空列表。来接收最终的目标数据。需放在循环外面,放在里面只能接收到最后一个字典元素。
my_list = []
#
for m in range(len(a)):
# 用变量b来接收每次循环分割得到的列表。TODO 先去除换行符,再将@符合替换为空格,根据空格分割处理好的字符串
b = a[m].strip(" ").replace("@", " ").split(" ")
# print(b)
# 定义一个空列表来接收最终处理好的列表b
c = []
# 定义一个空字典来接收组成的新列表元素
d = {}
# 循环遍历b列表来进行进行字符串分割,然后将分割后的列表添加到空列表c
for i in b:
# 对冒号的字符串进行分割
c.append(i.split(":"))
# print(c)
# 此处的c为列表嵌套列表 [['url', '/futureloan/mvc/api/member/register'], ['mobile', '18866668888'], ['pwd', '123456']]
# 循环遍历分割好的列表c,使用键值对添加元素到空字典d
for item in c:
# 观察发现key为列表的第一个索引值。值为列表的第二个索引值。
d[item[0]] = item[1]
# 将添加完成的字典作为一个整体添加到列表中作为元素。
my_list.append(d)
return my_list

# 精简的答案:
def convert_to_dict(line):
infos = line.split("@")
info_dict = {}
for info in infos:
info_list = info.split(":")

info_dict[info_list[0]] = info_list[1]
return info_dict

with open(my_file_path, "r", encoding="utf-8") as f:
# print(f.readlines())
lines = f.readlines()
new_lines = []
for line in lines:
new = convert_to_dict(line)
new_lines.append(new)
print(new_lines)

"""
3.编写如下程序
优化去生鲜超市买橘子程序
a.收银员输入橘子的价格,单位:元/斤
b.收银员输入用户购买橘子的重量,单位:斤
c.计算并且 输出 付款金额
新需求:
d.使用捕获异常的方式,来处理用户输入无效数据的情况
"""


def catch_exception():
while True:
price = input("收银员输入橘子的价格,单位:元/斤:")
weight = input("收银员输入用户购买橘子的重量,单位:斤:")
# pay = float(price) * float(weight)
try:
pay_money = float(price) * float(weight)
return pay_money
except ValueError as e:
print("你输入的价格是{},重量为{},其中有类型不正确,给你返回一个异常:{}".format(price, weight, e))


if __name__ == '__main__':
# 第一题给函数传入用户信息
person_info = [{"name": "yuze", "age": 17, "gender": "男", "hobby": "假正经", "motto": "I am yours"},
{"name": "cainiao", "age": 18, "gender": "女", "hobby": "看书", "motto": "Lemon is best!"}
]
# 调用添加内容函数,不使用print,因为没有返回值。
my_append(person_info)
# 调用读取数据操作
my_read()
print()
print("~" * 50, "上面是第一题的答案", "~" * 50)

info_1 = ["url:/futureloan/mvc/api/member/register@mobile:18866668888@pwd:123456",
"url:/futureloan/mvc/api/member/recharge@mobile:18866668888@amount:1000"]
my_info(info_1)

e = swap_data()
print("第二题读取并转换得到的最终数据为: {}".format(e))
print()
print("~" * 50, "下面是第三题的答案", "~" * 50)

b = catch_exception()
print("根据收银员输入的价格和重量得到的付款金额为:{}元".format(b))

 

 

 

 

 

 

 

 

 

 

原文地址:https://www.cnblogs.com/little-lucky/p/12995667.html