来着大拿老师的Python笔记
一、文件的读操作
一、open函数
'''
第一个参数必须有,表示文件路径和名称
mode:表示文件用什么方式打开
r:以只读方式打开
w:以写方式打开,会覆盖以前的内容
x:以创建方式打开,如文件以存在,则会报错
a:append方式打开,以追加的方式对文件内容进行写入
b:binary方式,二进制方式对文件内容写入
t:文本方式打开
+:可读写方式打开
'''
#打开文件,用写的方式
#r表示后面字符串内容不需转义
#f称之为文件句柄
f = open(r'E:/所思所感/关于做人.txt','w')
#文件打开后必须关闭
f.close()
二、with语句
#with语句
#with语句使用的技术是一种成为上下文管理协议的技术
#自动判断文件的作用域,自动关闭不在使用的打开的文件句柄
#这里我是用UTF-8编码格式
with open(r"E:/所思所感/关于做人.txt",'r',encoding='UTF-8') as f:
#本模块中不需要使用close关闭文件
#按行读取内容
strline = f.readline()
#保证完整读取文件直到结束
while strline:
print(strline)
strline = f.readline()
with open(r"E:/所思所感/关于做人.txt",'r',encoding='UTF-8') as f:
#创建列表
l = list(f)
for line in l:
print(line)
#read是按字符读取文件内容,允许输入参数决定读取自己自己字符,如果没有指定,默认从当前位置读到结尾
with open(r"E:/所思所感/关于做人.txt",'r',encoding='UTF-8') as f:
strChar = f.read()
print(len(strChar))
print(strChar)
#读3个换一行
with open(r"E:/所思所感/关于做人.txt",'r',encoding='UTF-8') as f:
#read参数的单位是字符,可以理解为一个汉字
strChar = f.read(3)
while strChar:
print(strChar)
strChar = f.read(3)
#tell函数
#用来显示文件读写指针的当前位置
with open(r"E:/所思所感/关于做人.txt",'r',encoding='UTF-8') as f:
#read参数的单位是字符,可以理解为一个汉字
strChar = f.read(3)
pos = f.tell()
while strChar:
print(pos)
print(strChar)
strChar = f.read(3)
pos = f.tell()
#tell的返回数字的单位是byte
三、seek
#seek(offset,from)
#from的取值范围
'''
0:从文件头开始偏移
1:从文件当前位置开始偏移
2:从文件末尾开始偏移
'''
#移动的单位是字节(byte)
#一个汉字由果敢个字节构成
#返回文件只针对当前位置
#案例:打开读写指针在0处,即文件的开头
with open(r"E:/所思所感/关于做人.txt",'r',encoding='UTF-8') as f:
#seek移动单位是字节
f.seek(8,0)#这里如果字节没有选对的话,会报错
strChar = f.read()
print(strChar)
二、文件的写操作
#文件的写操作write
'''
write(str):把字符串写入文件
writeline(str):把字符串按行写入文件
write函数参数只能是字符串
writelines参数可以是字符串也可以是字符序列
'''
#以追加的方法打开
with open(r'E:/所思所感/关于做人.txt','a',encoding='UTF-8') as f:
f.write("\n7.尽人事,听天命")
f.writelines("\n8.接下来就无所谓吧\n")
l = ['I','love','you']
f.writelines(l)
三、序列化/持久化
'''
序列化(持久化):把程序运行中的信息保存在磁盘上
反序列化:序列化的逆过程
pickle:python提供的序列化模块
pickle.dump:序列化
pickle.load:反序列化
'''
#序列化案例
import pickle
age = 19
with open(r'E:/所思所感/关于不做人.txt','wb') as f:
pickle.dump(age,f)
#反序列化案例
import pickle
age = 19
with open(r'E:/所思所感/关于不做人.txt','rb') as f:
age = pickle.load(f)
print(age)
'''
19
'''
import pickle
a = [19,'wihiudqwb',[909,20]]
with open(r'E:/所思所感/关于不做人.txt','wb') as f:
pickle.dump(a,f)
with open(r'E:/所思所感/关于不做人.txt','rb') as f:
a = pickle.load(f)
print(a)
'''
[19, 'wihiudqwb', [909, 20]]
'''
#持久化
'''
持久化工具
类似字典,用kv保存数据,存取方式跟字典也类似
open/close
'''
import shelve
#使用shelve创建文件并使用,并不止创建一个shv.db文件,还有其他
#shv相当于一个字典
shv = shelve.open(r'shv.db')
shv['one'] = 1
shv['two'] = 2
shv['three'] = 3
shv.close()
#看看读取案例
shv = shelve.open(r'shv.db')
print(shv['one'])
print(shv['two'])
shv.close()
'''
1
2
'''
#shelve特性:
#写入问题:不支持多个应用并行写入,为了解决这个问题,open的时候可以使用flag=r
#写回问题:shelve默认情况下不会等待持久化对象进行任何修改,解决方式:强制写回writeback=True
shv = shelve.open(r'shv1.db')
try:
shv['one'] = {'eins':1,"zwei":2}
finally:
shv.close()
shv = shelve.open(r'shv1.db')
try:
one = shv['one']
print(one)
#此时,一旦shelve关闭,则内容还是存在于内存中,没有写回数据库
one['enis'] = 100
finally:
shv.close()
shv = shelve.open(r'shv1.db')
try:
k1 = shv['one']
print(k1)
finally:
shv.close()
'''
并未发生修改
{'eins': 1, 'zwei': 2}
{'eins': 1, 'zwei': 2}
'''
shv = shelve.open(r'shv1.db')
try:
shv['one'] = {'eins':1,"zwei":2}
finally:
shv.close()
shv = shelve.open(r'shv1.db',writeback=True)#强制写回
try:
one = shv['one']
print(one)
#此时,一旦shelve关闭,则内容还是存在于内存中,没有写回数据库
one['enis'] = 100
finally:
shv.close()
shv = shelve.open(r'shv1.db')
try:
k1 = shv['one']
print(k1)
finally:
shv.close()
'''
已经发生了修改
{'eins': 1, 'zwei': 2}
{'eins': 1, 'zwei': 2, 'enis': 100}
'''
#使用with来打开
with shelve.open(r'shv1.db',writeback=True) as shv:
k1 = shv['one']
print(k1)
k1['eins'] = 1000
with shelve.open(r'shv1.db') as shv:
print(shv['one'])
'''
{'eins': 1, 'zwei': 2, 'enis': 100}
{'eins': 1000, 'zwei': 2, 'enis': 100}
'''