一、文件操作
(一)读取文件的简单操作
读取文件
# 第一个参数--文件的路径
# 第二个参数--访问文件的模型,r表示读,默认就是r模式
a=open('d:\\a.txt','r') # a叫做文件句柄,用来操作文件
b=a.read()
print(b)
a.close()
(二)文件权限
1.读取操作
(1)r--以只读方式打开文件。文件的指针会放在文件的开头。这是默认模式。
(2)rb--以二进制格式打开一个文件用于只读。文件的指针会放在文件的开头。一般用于非文本文件如图片等。
(3)r+--打开一个文件用于读写。文件的指针会放在文件的开头。
(4)rb+--以二进制格式打开一个文件用于读写。文件的指针会放在文件的开头。一般用于非文本文件如图片等。
2.写操作
(1)w--打开一个文件只用于写入。如果该文件已存在则打开文件,删除原内容,从头开始编辑。如果该文件不存在,创建新文件。
(2)wb--以二进制格式打开一个文件只用于写入。如果该文件已存在则打开文件,删除原内容,从头开始编辑。如果该文件不存在,创建新文件。一般用于非文本文件如图片等。
(3)w+--打开一个文件用于读写。如果该文件已存在则打开文件,删除原内容,从头开始编辑。如果该文件不存在,创建新文件。
(4)wb+--以二进制格式打开一个文件用于读写。如果该文件已存在则打开文件,删除原内容,从头开始编辑。如果该文件不存在,创建新文件。一般用于非文本文件如图片等。
(5)a--打开一个文件用于追加。如果该文件已存在,文件指针会放在文件的结尾。如果该文件不存在,创建新文件进行写入。
(6)ab--以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针会放在文件的结尾。如果该文件不存在,创建新文件进行写入。
(7)a+--打开一个文件用于读写。如果该文件已存在,文件指针会放在文件的结尾。如果该文件不存在,创建新文件进行读写。
(8)ab+--以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针会放在文件的结尾。如果该文件不存在,创建新文件进行读写。
(三)文件操作
1.读操作
(1)read()--会一次性读取全部内容。可加size参数,规定一次最多读取的size个字节。
a=open('d:\\a.txt','r')
print(a.read(4))
print(a.read(5))
a.close()
(2)readline()--每次读取一行,并且每一行末尾会读到\n,自带换行功能。也可加size参数。
a=open('d:\\a.txt','r')
b=a.readline()
print(b) # 空行--解析出了\n
print(len(b))
a.close()
a=open('d:\\a.txt','r')
b=a.readline()
while len(b)>0:
print(b)
b=a.readline()
a.close()
(3)readlines()--一次性以行的形式读取文件的所有内容,并返回一个list(包括\n),需要遍历读出。
a=open('d:\\a.txt','r')
b=a.readlines()
print(b)
for x in b:
print(x)
a.close()
(4)循环读取--句柄是一个可迭代的对象,因此可以循环读取文件中的内容,每次读一行。
for x in open('d:\\a.txt','r'):
print(x)
2.写操作
(1)write()--打开一个文件用于写入。若文件存在,打开,并删除院内用,从头进行编辑;若不存在,创建新文件。
a=open('d:\\a.txt','w')
a.write('我爱北京天安门')
a.close()
(2)writelines()--把参数中的内容全部写入文件中(多行一次性写入)。
ls=['aa','b\n','cc']
a=open('d:\\a.txt','w')
a.writelines(ls)
a.close()
(四)with
使用with方式操作文件,可以不用关闭文件,会自动关闭文件。
with open('d:\\a.txt','r') as f:
b=f.read()
print(b)
(五)指定文件格式,向文件中保存内容
with open('a.txt','w',encoding='utf-8') as p:
p.write('你好呀')
二、os模块
import os
(一)重命名文件
os.rename('a.txt','b.txt')
(二)删除文件
os.remove('b.txt')
(三)创建目录
os.mkdir('x')
(四)删除目录
os.rmdir('x')
(五)创建多级目录
os.makedirs('a/a/a')
(六)删除多级目录
os.removedirs('a/a/a')
(七)获取当前所在目录
print(os.getcwd())
(八)获取目录列表
print(os.listdir(os.getcwd()))
(九)切换所在目录
os.chdir('E:\\')
print(os.getcwd())
(十)判断文件或文件夹是否存在
b=os.path.exists('E:\pywork\day13')
print(b)
(十一)判断是否为文件
print(os.path.isfile('extend.py'))
(十二)判断是否为目录
print(os.path.isdir('E:\pywork\day13'))
(十三)获取绝对路径
print(os.path.abspath('extend.py'))
(十四)判断是否为绝对路径
print(os.path.isabs(os.getcwd()))
(十五)获取路径中的最后部分
print(os.path.basename(os.getcwd()))
(十六)获取路径中的路径部分
print(os.path.dirname('E:\\pywork\\day08\\p1\\demox.py'))
print(os.path.dirname('E:\\pywork\\day08\\p1\\p'))
三、异常
当python脚本发生异常时,我们需要捕获处理它,否则程序会终止执行。
如果发生的异常类型和捕获的异常类型不相同,还是不能捕获异常,程序还是会结束。
while True:
try:
a=eval(input('请输入表达式:'))
print(a)
except ZeroDivisionError as e:
print('除数为零,错误!')
print(e)
break
多分支结构,捕获多个异常
try:
a=[1,2,3]
print(a[3])
print(3/0)
except IndexError as i:
print(i)
except ZeroDivisionError as e:
print(e)
print('结束')
元组结构捕获多个异常
try:
a = [1, 2, 3]
print(a[3])
print(3 / 0)
except (IndexError,ZeroDivisionError) as e:
print('有异常',e)
print('结束')
捕获所有异常
# except或except Exception
try:
a = [1, 2, 3]
print(a[1])
print(1/0)
except Exception as f:
print(f)
print('结束')
else格式
无异常正常结束则执行else中代码
注意,一定要有except
try:
a=[1,2,3]
print(a[1])
except IndexError as i:
print(i)
else:
print('无异常')
print('结束')
try...finally格式
try:
a=[1,2,3]
print(a[3])
except IndexError as f:
print(f)
else:
print('无异常')
finally:
print('无论有没有错误,我都会执行')
四、触发异常
(一)抛出系统异常
while True:
name=input('请输入姓名:')
try:
if len(name)<2:
raise Exception('错误')
except Exception as f:
print(f)
break
(二)抛出自定义异常
class MyExcept(Exception):
def __init__(self,xx):
self.xx=xx
def __str__(self):
return self.xx
try:
raise MyExcept('天上下雨了')
except MyExcept as f:
print(f)
class ShortExpection(Exception):
def __init__(self,length,at_least_len):
self.length=length
self.at_least_len=at_least_len
def __str__(self):
return '您输入了{}个字符,最少要{}个字符'.format(self.length,self.at_least_len)
t=input('请输入字符串:')
try:
raise ShortExpection(len(t),10)
except ShortExpection as f:
print(f)
五、设计模式
(一)单例模式
class A():
def __new__(cls, *args, **kwargs):
if not hasattr(cls,'xIns'):
cls.xIns=object.__new__(cls) # 产生一个此类的对象
return cls.xIns
def __init__(self,name):
self.name=name
zs=A('张三')
print(A.xIns.name)
ls=A('李四')
print(A.xIns.name)
print(zs.name)
print(zs is ls)
(二)工厂模式
class Bmw():
def run(self):
print('宝马在跑')
class Benc():
def run(self):
print('奔驰在跑')
class Audi():
def run(self):
print('奥迪在跑')
class Factory():
@staticmethod
def makeCar(name):
if name=='宝马':
return Bmw()
elif name=='奔驰':
return Benc()
else:
return Audi()
a=Factory.makeCar('宝马')
b=Factory.makeCar('奔驰')
c=Factory.makeCar('奥迪')
a.run()
b.run()
c.run()
(三)观察者模式
class Boss():
def __init__(self):
self.observers=[]
self.status=''
# 绑定观察者
def attach(self,ob):
self.observers.append(ob)
# 通知观察者
def notify(self):
for ob in self.observers:
ob.update()
class Employee():
def __init__(self,name,boss):
self.name=name
self.boss=boss # 绑定通知者
def update(self):
print('{},{}赶快工作'.format(self.boss.status,self.name))
if __name__=='__main__':
ljc=Boss()
# 互相绑定
zs=Employee('张三',ljc)
ls=Employee('李四',ljc)
ljc.attach(zs)
ljc.attach(ls)
ljc.status='李嘉诚回来了'
ljc.notify()
(四)策略模式
class CashNorm():
def accept_money(self,money):
return money
class Cash_rate(): # 打折
def __init__(self,rate):
self.rate=rate
def accept_money(self,money):
return self.rate*money
class Cash_condition(): # 满减
def __init__(self,condition,ret):
self.condition=condition
self.ret=ret
def accept_money(self,money):
if money<self.condition:
return money
else:
return money-money//self.condition*self.ret
class Context():
def __init__(self,style):
self.style=style
def getResult(self,money):
return self.style.accept_money(money)
if __name__=='__main__':
a={}
a[0]=Context(CashNorm())
a[1]=Context(Cash_rate(0.8))
a[2]=Context(Cash_condition(300,50))
style=int(input('请输入优惠方式:'))
if style>2:
style=0
money=float(input('请输入金额:'))
print(a[style].getResult(money))
扩展题
用mkdir实现makedirs
import os
a=input("请输入想要创建的多层文件,以'/'分隔:")
lst=a.split('/')
for i in range(len(lst)):
if not os.path.exists(lst[i]):
os.mkdir(lst[i])
os.chdir(lst[i])