python学习第10天

对象持久化以及关于字符的一些处理

文本文件存储持久化

没什么说的,就是将数据存入文本文件
使用eval可以直接将字符串的语句执行

In[2]: a='[1,2,3,4,5]'
In[3]: b=eval(a)
In[4]: b
Out[4]: [1, 2, 3, 4, 5]

pickle

pickle可以处理一些数据
.dumps(obj)将对象序列转化为字符串
.loads(str):将字符串转为对象序列

In[5]: a={'name':'Tom','age':20}
In[6]: import pickle
In[7]: pickle.dumps(a)
Out[7]: b'\x80\x03}q\x00(X\x04\x00\x00\x00nameq\x01X\x03\x00\x00\x00Tomq\x02X\x03\x00\x00\x00ageq\x03K\x14u.'
In[8]: s=pickle.dumps(a)
In[9]: p=pickle.loads(s)
In[10]: p
Out[10]: {'name': 'Tom', 'age': 20}

.load()和.dump()多了第二个文件的参数,可以将转化后的内容写入文件,接上个例子

In[11]: pickle.dump(a,open('pickle_db','wb'))
In[12]: p=pickle.load(open('pickle_db','rb'))
In[13]: p
Out[13]: {'name': 'Tom', 'age': 20}
In[14]: type(p)
Out[14]: dict

shelve模块

将多个序列存到一个文件中,不需要声明文件类型和模式
可以将多个序列以类似于字典的用法保存在文件中,提供了很多功能
如:

In[15]: import shelve
In[16]: scores=[99,88,77]
In[17]: student={'name':'Mike','age':16}
In[18]: db=shelve.open('shelve_stu')
In[19]: db['s']=student
In[20]: db['scores']=scores
In[21]: student_=db['s']
In[22]: student_
Out[22]: {'name': 'Mike', 'age': 16}
In[23]: type(student_)
Out[23]: dict
In[24]: db['scores']
Out[24]: [99, 88, 77]
In[25]: len(db)
Out[25]: 2
In[26]: del db['s']
In[27]: db['s']
Traceback (most recent call last):
  File "G:\Anaconda3\envs\tensorflow\lib\shelve.py", line 111, in __getitem__
    value = self.cache[key]
KeyError: 's'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "G:\Anaconda3\envs\tensorflow\lib\site-packages\IPython\core\interactiveshell.py", line 3326, in run_code
    exec(code_obj, self.user_global_ns, self.user_ns)
  File "<ipython-input-27-3d046767e322>", line 1, in <module>
    db['s']
  File "G:\Anaconda3\envs\tensorflow\lib\shelve.py", line 113, in __getitem__
    f = BytesIO(self.dict[key.encode(self.keyencoding)])
  File "G:\Anaconda3\envs\tensorflow\lib\dbm\dumb.py", line 153, in __getitem__
    pos, siz = self._index[key]     # may raise KeyError
KeyError: b's'

字节与字符

字符串是平时我们用的,将字符串通过某种编码方式得到的是字节,字节可以再解码得到字符串,编码方式用很多种,如ASCII、latin-1、utf-8,utf-16等等,最常用的是utf-8
用两个内置函数ord()和chr()
ord():可以通过字符获取其对应的代码点
chr():通过代码点获得字符

In[35]: ord('A')
Out[35]: 65
In[36]: chr(65)
Out[36]: 'A'
In[37]: chr(223)
Out[37]: 'ß'
In[38]: ord('ß')
Out[38]: 223
In[39]: ord('有')
Out[39]: 26377
In[40]: chr(26377)
Out[40]: '有'
In[41]: chr(26378)
Out[41]: '朊'

使用str.encode(…)和bytes.encode(…)可以分别将字符串编码和解码

In[43]: s1='ABCD'
In[44]: s1.encode('ASCII')
Out[44]: b'ABCD'
In[45]: s2='你好啊'
In[46]: type(s2)
Out[46]: str
In[48]: s2.encode('ASCII')     #ASCII不支持中文,会报错
Traceback (most recent call last):
  File "G:\Anaconda3\envs\tensorflow\lib\site-packages\IPython\core\interactiveshell.py", line 3326, in run_code
    exec(code_obj, self.user_global_ns, self.user_ns)
  File "<ipython-input-48-fab43662f5c5>", line 1, in <module>
    s2.encode('ASCII')     #ASCII不支持中文,会报错
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-2: ordinal not in range(128)
Out[52]: b'\xc3\xa4\xc2\xbd\xc2\xa0\xc3\xa5\xc2\xa5\xc2\xbd\xc3\xa5\xc2\x95\xc2\x8a'
In[53]: b1=b'\xe4\xbd\xa0\xe5\xa5\xbd\xe5\x95\x8a'
In[54]: type(b1)
Out[54]: bytes
In[55]: b1.decode('utf8')
Out[55]: '你好啊'
In[56]: s1.encode()       #自动编码,b开头代表字节
Out[56]: b'ABCD'
In[57]: import sys
In[58]: sys.getdefaultencoding()                     #得到系统默认的编码方式
Out[58]: 'utf-8'

bytes是字符串编码过后得到的类型,有前缀b,可以指定编码方式,不指定就b’…'的方式,bytearray是另一种更灵活的和字节有关的类型

In[61]: bytes('你好','utf8')     #将字符串转换为指定编码
Out[61]: b'\xe4\xbd\xa0\xe5\xa5\xbd'
In[62]: bytes('abc','ascii')
Out[62]: b'abc'
In[63]: bytes([67,66,78,90])
Out[63]: b'CBNZ'
In[64]: b=b'abc'   #前面加个b表示是bytes类型
In[65]: type(b)
Out[65]: bytes
In[66]: b
Out[66]: b'abc'
In[67]: b[0]=65    #bytes类型不能修改
Traceback (most recent call last):
  File "G:\Anaconda3\envs\tensorflow\lib\site-packages\IPython\core\interactiveshell.py", line 3326, in run_code
    exec(code_obj, self.user_global_ns, self.user_ns)
  File "<ipython-input-67-035d186776c1>", line 1, in <module>
    b[0]=65    #bytes类型不能修改
TypeError: 'bytes' object does not support item assignment

bytearray可以修改其中的值,其他和bytes类似

In[77]: ba=bytearray('abc','utf8')
In[78]: ba[0]=65
In[79]: ba
Out[79]: bytearray(b'Abc')
In[80]: ba.append(99)
In[81]: ba
Out[81]: bytearray(b'Abcc')
In[82]: ba.decode()              #.decode()方法使其转换为字符串
Out[82]: 'Abcc'

BOM字节标记:将文本内容前面多出来一部分字节标记的内容,在文件中一般看不见,只有用read()时,可以看见

In[93]: open('data.txt','w',encoding='utf-8-sig').write('你好') 
Out[93]: 2
In[94]: open('data.txt','r',encoding='utf-8-sig').read()
Out[94]: '你好'
In[95]: open('data.txt','r',encoding='utf-8').read()
Out[95]: '\ufeff你好'

encoding中编码方式加一个’-sig’表示以带有bom字节顺序标记的方式写文件
如果以普通方式读,前面会多一个标记符号
所以读的时候也应该编码方式价格’-sig’

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值