字符串相关总结
1.编码值来说: ASCII 每个字符用1字节表示 8位 ; Unicode 每个字符4字节表示 32位;
GBK 国标码 2字节 16位 ;utf-8 可变长度的Unicode 每个字符最少占8位 比如:一个英文占8位一个字节,一个中文字符占3个字节
注意: b''表示后面的是字节
2. str()内置函数强制进行数据转换
把其他数据类型强制转换成字符串类型,用str()内置函数
dic = {'1':'2'}
print([str(dic),dic]) #["{'1': '2'}", {'1': '2'}]
print([str([1,2,3]),[1,2,3]])#['[1, 2, 3]', [1, 2, 3]] 为了区分列表和字符串,转化后列表加引号
str_dic = str([1,2,3]) print(str_dic,type(str_dic))
#[1, 2, 3] <class 'str'> 把列表转化成字符串,引号可有可无
3.json 序列化模块 进行序列化
序列 : 有序的数据类型都叫序列 列表,元组,字符串,bytes
序列化: 将其他数据类型转化成字符串,bytes类型
为什么序列化: 1. 网络上传输的都是字节 2.文件中存储的不是字节就是字符串
json模块 处理字符串和字典数据转换
1. 在字典序列化的过程中,会强制把键转化成字符串,把值里边的元组转化为列表
dic = {1 : [1,2,3],2 : (4,5,'aa')}
ret = json.dumps(dic) # 序列化
print(dic,type(dic))
print(ret,type(ret))
res = json.loads(ret) # 反序列化
print(res,type(res))
{1: [1, 2, 3], 2: (4, 5, 'aa')} <class 'dict'>
{"1": [1, 2, 3], "2": [4, 5, "aa"]} <class 'str'>
{'1': [1, 2, 3], '2': [4, 5, 'aa']} <class 'dict'>
3.集合是不能序列化的, 元组不能做键
json 在所有的语言之间都通用 : json序列化的数据 在python上序列化了 那在java中也可以反序列化
能够处理的数据类型是非常有限的 : 字符串 列表 字典 数字
字典中的key只能是字符串
# 向文件中记录字典 import json dic = {'key' : 'value','key2' : 'value2'} ret = json.dumps(dic) # 序列化 with open('json_file','a') as f: f.write(ret) f.flush() # 从文件中读取字典 with open('json_file','r') as f: str_dic = f.read() dic = json.loads(str_dic) print(dic.keys())
# dump load 是直接操作文件的 dic = {'key1' : 'value1','key2' : 'value2'} with open('json_file','a') as f: json.dump(dic,f) with open('json_file','r') as f: dic = json.load(f) print(dic.keys())
# 问题5 不支持连续的存 取 针对dump,load dic = {'key1' : 'value1','key2' : 'value2'} with open('json_file','a') as f: json.dump(dic,f) json.dump(dic,f) json.dump(dic,f) with open('json_file','r') as f: dic = json.load(f) print(dic.keys())
#这段代码会报错,可以连续dump,连续三次dump,结果如下三次结果在一行,所以load才会报错
{"key2": "value2", "key1": "value1"}{"key2": "value2", "key1": "value1"}{"key2": "value2", "key1": "value1"}
如果想连续存储,只能用dumps,loads一行一行的存,取
dic = {'key1' : 'value1','key2' : 'value2'} with open('json_file','a') as f: str_dic = json.dumps(dic) f.write(str_dic+'\n') str_dic = json.dumps(dic) f.write(str_dic + '\n') str_dic = json.dumps(dic) f.write(str_dic + '\n') with open('json_file','r') as f: for line in f: dic = json.loads(line.strip()) print(dic.keys())
import json data = {'username':['李华','二愣子'],'sex':'male','age':16} json_dic2 = json.dumps(data,sort_keys=True,indent=4,separators=(',',':'),ensure_ascii=False) print(json_dic2)
{
"age":16,
"sex":"male",
"username":[
"李华",
"二愣子"
]
}
4.pickle 支持python中几乎所有的数据类型,序列化后只能是字节,只能在python中使用,在写入,读文件时只能用'wb','rb',可以多次dump,load
dic = {(1,2,3):{'a','b'},1:'abc'}
dic1 = {(1,2,3):{'a','b'},2:'abc'}
dic2 = {(1,2,3):{'a','b'},3:'abc'}
dic3 = {(1,2,3):{'a','b'},4:'abc'}
with open('pickle_file','wb') as f:
pickle.dump(dic, f)
pickle.dump(dic1, f)
pickle.dump(dic2, f)
pickle.dump(dic3, f)
with open('pickle_file','rb') as f:
ret = pickle.load(f)
print(ret,type(ret))
ret = pickle.load(f)
print(ret,type(ret))
ret = pickle.load(f)
print(ret, type(ret))
ret = pickle.load(f)
print(ret, type(ret))
ret = pickle.load(f)
print(ret, type(ret))
5.关于字符串的操作
(1),编码的转换,encode('utf-8')用utf-8编码成字节 ,decode('utf-8'):用utf-8解码成字节
s = "你好" bs = s.encode("UTF-8") print(bs) s1 = bs.decode("UTF-8") print(s1)
(2) 还可以用内置函数bytes()
bs = bytes(s, encoding="utf-8") # 把字符串编码成UTF-8 print(bs)
(3)eval(),exec(),compile()区别
eval() 执⾏字符串类型的代码. 并返回最终结果 print(eval("2+2")) # 4 n = 8 print(eval("2+n")) # 10 def func(): print(666) eval("func()") # 666 exec() 执⾏字符串类型的代码 exec(""" for i in range(10): print(i) """) exec(""" def func(): print("我是周杰伦") func() """) compile() 将字符串类型的代码变异. 代码对象能够通过exec语句来执⾏或者eval()进⾏求 值 ''' 参数说明: 1. resource 要执⾏的代码, 动态代码⽚段 2. ⽂件名, 代码存放的⽂件名, 当传⼊了第⼀个参数的时候, 这个参数给空就可以了 3. 模式, 取值有3个, 1. exec: ⼀般放⼀些流程语句的时候 2. eval: resource只存放⼀个求值表达式. 3. single: resource存放的代码有交互的时候. mode应为single ''' code1 = "for i in range(10): print(i)" c1 = compile(code1, "", mode="exec") exec(c1) code2 = "1+2+3" c2 = compile(code2, "", mode="eval") a = eval(c2) print(a) code3 = "name = input('请输⼊你的名字:')" c3 = compile(code3, "", mode="single") exec(c3) print(name) 有返回值的字符串形式的代码⽤eval(). 没有返回值的字符串形式的代码⽤exec(). ⼀般很少⽤ 到compile()

浙公网安备 33010602011771号