一、with语法
生成一个有学生成绩的csv文件
import csv
file = open('学生成绩.csv', 'w', encoding='utf-8')
myWrite = csv.writer(file)
col = ['姓名', '成绩']
myWrite.writerow(col)
file.close()
with语法,经常和open方法搭配使用
with:预定义的清理操作(当一个对象长期没有被使用时就会被清理)
with open('学生成绩2.csv', 'w', encoding='utf-8', newline='') as file_1:
pass
只要with缩进中的代码执行完了,那么这个文件所占用的进程或线程就会被清理掉(可以理解为文件被关闭)
二、数据类型的转换
字符串类型的字典如何转回字典 —— 使用eval方法
eval方法:能够将字符串类型的任意数据、表达式转换为其原来的样子,让其具有原来的功能
str1 = '{"name":"张三"}'
print(str1, type(str1))
a = eval(str1)
print(a, type(a))
运行结果:{"name":"张三"} <class 'str'>
{'name': '张三'} <class 'dict'>
b = eval(str(123))
print(b, type(b))
c = eval('1 + 2 + 3 + 4')
print(c, type(c))
d = eval('1 > 2')
运行结果:123 <class 'int'>
10 <class 'int'>
False <class 'bool'>
但是eval方法会涉及到安全问题,如果字符串中有恶意指令,那么eval方法会直将恶意指令执行
例如:(可见最后结果为乱码)
import os
os.system('ls')
str2 = "__import__('os').system('ls')"
print(eval(str2))
运行结果:'ls' �����ڲ����ⲿ���Ҳ���ǿ����еij���
�����������
1
'ls' �����ڲ����ⲿ���Ҳ���ǿ����еij���
�����������
literal_eval相对于eval方法,不会还原字符串类型的表达式
也就意味着,如果字符串中有恶意指令,不会去执行
import ast
a1 = ast.literal_eval('[1,2,3]')
print(a1, type(a1))
运行结果:[1, 2, 3] <class 'list'>