字符串相关总结

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()

 

 


posted @ 2021-01-28 17:11  苦行僧冬*婷  阅读(53)  评论(0)    收藏  举报