python基础(文件、异常、模块、类、对象)

本文详细介绍了Python中的文件操作,包括打开、读取、写入和关闭文件,以及文件光标管理。同时,讲解了模块的概念,特别是os模块在文件系统中的应用。此外,还探讨了pickle模块用于序列化和反序列化Python对象的方法。异常处理部分涵盖了常见的Python异常类型、如何捕获和处理异常,以及try-except-else-finally语句的使用。最后,简要提到了Python中的面向对象编程基础,如类、对象、继承和多态。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

文件:

  • 打开文件使用open函数,open()的第一个参数是:要打开文件的路径,如果只传入文件名那么将在当前文件下查找文件并打开。第二个参数是:文件的打开模式,其他参数都是默认的。文件的打开模式如下图所示:

在这里插入图片描述

f=open('C:\\Users\\Lenovo\\Desktop\\test.txt','r')
f#这个f是文件对象
<_io.TextIOWrapper name='C:\\Users\\Lenovo\\Desktop\\test.txt' mode='r' encoding='cp936'>
#这里name是取自的路径,mode是打开的模式,encoding是编码格式

文件的读取操作:

需要用到以下几个文件对象方法:
在这里插入图片描述

f=open('C:\\Users\\Lenovo\\Desktop\\test.txt','rt',encoding="utf-8")
以只读文本模式打开文件,编码是utf-8
str3=f.read()
str3
'年后ijrgwingjnvjnjfdnv困难克服斯诺克女可男可女开心呢可能可男可女可能可男可女 可能发生空空死你女那oadnfkln'
f.tell()
144#文件光标的位置,打开开文件时,光标在文件头,进行读取操作后光标会发生移动
f.seek(0,0)
0#将光标移动到文件的头
f.close()#关闭文件


f=open('C:\\Users\\Lenovo\\Desktop\\test2.txt','w',encoding="utf-8")
str4="这是一个新文件"
f.write(str4)#返回写入文件的字节数
7
f.close()
#写完后关闭后才会写入,不关闭存在缓冲区里面

想要将文件里的内容迭代输出的话可以使用for循环
方法一:先将文件对象转化为序列再输出
for each in list(b):
	print(each)
	
这是一个新文件

这是一个新文件

这是一个新文件

这是一个新文件

这是一个新文件

方法二:直接对文件对象进行操作(推荐使用)
for each in b:
	print(each)
	
这是一个新文件

这是一个新文件

这是一个新文件

这是一个新文件

这是一个新文件

模块:

  • 模块就是可用代码段的打包,模块是一个包含你所定义的所有函数和变量的文件,后缀是.py。模块可以被别的程序引入,以使用该模块中的函数等功能。
  • 我们所知道常用的操作系统就有:Windows、Mac OS、Linux、UNIX等,这些操作系统底层对于文件系统的访问工作原理是不一样的,因此你可能就要针对不同的操作系统来考虑使用哪些文件系统模块,这样的做法非常不友好且麻烦,因为这样意味着当你的程序运行环境一改变,你就要相应的去修改大量代码来应付。那么有了OS模块,我们不需要关心什么操作系统下使用什么模块,OS模块会帮助你选择正确的模块并调用。

os模块中关于文件/目录常用的函数使用方法

pickle模块:

这个模块几乎可以将prthon的对象转化为二进制的形式取放字节流。
存放:picking,读取:unpicking,pickle模块的使用:

my_list=["123",123,["hello",3.14]]
my_list
['123', 123, ['hello', 3.14]]
pick_file=open("C:\\Users\\Lenovo\\Desktop\\","wb")#注意要使用wb的方式创建文件
pickle.dump(my_list,pick_file)#将列表以二进制的方式存入到文件中
pick_file.close()#关闭该文件,只有关闭后才会保存到文件中去

如果要读取的话:
pick_file=open("C:\\Users\\Lenovo\\Desktop\\test.pkl","rb")#先将文件以二进制可读的方式打开
my_list2=pickle.load(pick_file)#文件利用load读取到my_list2列表
my_list2
['123', 123, ['hello', 3.14]]

异常处理:

Python标准异常总结

  • AssertionError 断言语句(assert)失败
  • AttributeError 尝试访问未知的对象属性
  • EOFError 用户输入文件末尾标志EOF(Ctrl+d)
  • FloatingPointError 浮点计算错误
  • GeneratorExit generator.close()方法被调用的时候
  • ImportError 导入模块失败的时候
  • IndexError 索引超出序列的范围
  • KeyError 字典中查找一个不存在的关键字
  • KeyboardInterrupt 用户输入中断键(Ctrl+c)
  • MemoryError 内存溢出(可通过删除对象释放内存)
  • NameError 尝试访问一个不存在的变量
  • NotImplementedError 尚未实现的方法
  • OSError 操作系统产生的异常(例如打开一个不存在的文件)
  • OverflowError 数值运算超出最大限制
  • ReferenceError 弱引用(weak reference)试图访问一个已经被垃圾回收机制回收了的对象
  • RuntimeError 一般的运行时错误
  • StopIteration 迭代器没有更多的值
  • SyntaxError Python的语法错误
  • IndentationError 缩进错误
  • TabError Tab和空格混合使用
  • SystemError Python编译器系统错误
  • SystemExit Python编译器进程被关闭
  • TypeError 不同类型间的无效操作
  • UnboundLocalError 访问一个未初始化的本地变量(NameError的子类)
  • UnicodeError Unicode相关的错误(ValueError的子类)
  • UnicodeEncodeError Unicode编码时的错误(UnicodeError的子类)
  • UnicodeDecodeError Unicode解码时的错误(UnicodeError的子类)
  • UnicodeTranslateError Unicode转换时的错误(UnicodeError的子类)
  • ValueError 传入无效的参数
  • ZeroDivisionError 除数为零

程序运行过程中可能会抛出某些异常,但是这些异常不会使程序崩溃。那么如何检测和处理这些异常呢?

  • 异常的检测可以使用try语句,try语句捕获到异常时,异常后面的语句将不会被执行会被跳过。
    在这里插入图片描述
    栗子:
try:
    f=open("hhhh.txt")
    print(f.read())
    f.close()
except OSError:
    print("文件出错")

如果使用as reason这个可选的参数:
try:
    f=open("hhhh.txt")
    print(f.read())
    f.close()
except OSError as reason:
    print("文件出错\n错误的原因是:"+str(reason))
    
文件出错
错误的原因是:[Errno 2] No such file or directory: 'hhhh.txt'

要捕获多个异常(try语句捕获到异常时,异常后面的语句将不会被执行会被跳过,所以第二个异常没有被打印):
try:
    sum=1+'1'
    f=open("hhhh.txt")
    print(f.read())
    f.close()
except OSError as reason:
    print("文件出错\n错误的原因是:"+str(reason))
except TypeError as reason:
    print("类型出错\n错误的原因是:"+str(reason))

类型出错
错误的原因是:unsupported operand type(s) for +: 'int' and 'str'

以下方式可以检测多个异常:
try:
    sum=1+'1'
    f=open("hhhh.txt")
    print(f.read())
    f.close()
except (OSError,TypeError):
    print("出错")


如果想只要程序中出现异常,不管是什么类型的都有提示,可以这样做(不推荐):
try:
    sum=1+'1'
    f=open("hhhh.txt")
    print(f.read())
    f.close()
except:
    print("出错")
  • 另一个实现方式
    在这里插入图片描述

栗子:

try:
    f=open("C:\\Users\\Lenovo\\Desktop\\hhhh.txt","w")
    sum=1+'1'
    f.close()
except (OSError,TypeError):
    print("出错")
finally:#这里面的语句无论如何都会被执行
    f.close()#防止因异常退出而文件没有被关闭,而导致数据丢失
  • 可以使用raise语句自己引发一个异常,只需要在raise后面加上一个异常的名称就好。例如:raise ZeroDivisionError引发除0异常。也可以:raise ZeroDivisionError("除数为0")

丰富的else语句:
else语句可以和if语句配合使用:要么怎样,要么不怎样。还可以和while、for循环语句搭配使用:干完了能怎样,干不完就别想怎样。还能和异常处理语句搭配使用:没有问题就干吧。

  • 当else和循环配合使用的话,如果循环里面的代码正常的执行完,没有使用break等退出,则会执行循环外else后面的代码。
while:
    正常退出
else:
    这里会被执行,否则不被执行
  • 只要try语句块里面没有出现任何的异常,将会执行else里面的语句
try:
    int("abc")
except ValueError as reason:
    print("出错了"+str(reason))
else:
    print("没有任何异常")

简洁的with语句:
with在你使用完文件忘记关闭后,with语句就会帮助你关闭。

try:
    with open("hhhh.txt")as fd:#fd是文件标签
        print(f.read())#注意代码的缩进with下面要将代码缩进
except OSError as reason:
    print("文件出错\n错误的原因是:"+str(reason))

对象:
对象就是属性加方法,静态的特征称为属性,动态行为称为方法。在pyhton中约定类名以大写字母开头,函数以小写字母开头,注意: 如果属性的名字和方法相同,属性会将方法覆盖掉。那么:1、不要试图在一个类里面定义出所有能想到的特性和方法,应该利用继承和组合机制进行扩展。2、用不同的词性命名,如属性用名词,方法名用动词。

类的定义:

class Turtle:
    #属性
    color="green"
    weight=10

    #方法
    def climb(self):#self相当于C++的this指针,在python中定义类的时候默认self作为第一个参数
        print("爬行")


t=Turtle()#生成类对象,创建类的实例对象
t.climb()#适用类方法

继承:

是子类自动共享父类之间数据和方法的机制,子类继承父类所有的属性和方法,如果子类中定义与父类同名的方法或属性,则会自动覆盖父类对应的方法或属性,对父类不受影响,当子类重写父类的构造方法时,如果还想有父类的功能,那么有两种方法:1、调用未绑定的父类方法(只需要在子类构造方法中,写上父类的名字.构造方法名称,调用父类的构造函数即可)2、使用super函数(只需要在子类构造方法中通过super函数调用父类的构造方法即可:surper().__init__(),括号里面self也不用写)。多重继承: 一个子类继承多个父类,写法:class Son(father1,father2,.....)

class MyList (list):
    pass
#pass表示占位符,表示不做任何事情,list表示继承list


>>> class Parent:
	def hello(self):
		print("父类方法在子类中被调用")
	
>>> class Son(Parent):
	pass

>>> 
>>> d=Son()
>>> d.hello()
父类方法在子类中被调用

>>> class Son(Parent):
	def hello(self):
		print("子类覆盖父类方法")

		
>>> C=Son()
>>> C.hello()
子类覆盖父类方法

多态: 不同对象对同一方法响应不同的行动。也就是不同类里面定义方法的名相同但是方法的内容不同。

>>> class First:
	def func(self):
		print("hello")

		
>>> class Second:
	def func(self):
		print("你好")

		
>>> a=First()
>>> a.func()
hello
>>> b=Second()
>>> b.func
>>> b.func()
你好
>>> 

构造函数: 需要用到函数_ _init_ _(self)方法,在对象实例化时,传入参数,可以重写_ _init_ _(self)方法来初始化对对象的操作。

class New:
	def _init_(self,name):
		self.name=name
	def func(self):
		print("%s爬"%self.name)
>>> b=New("给我")
>>> b.func()
给我爬

公有和私有:

在pyhton中没有像c++一样的关键字来说明公有还是私有。默认对象的属性和方法都是公有的可以通过.操作符访问,为了实现私有变量的特征,python内部采用了name mangling(名字改编,名字重整)技术,在python中定义私有变量只需要在变量名或者函数名前加上_ _两个下划线,那么这个函数或变量就会为私有的了。这样外部就无法访问到了。

>>> class New:
	__name="小鱼酱"#私有的
	def func(self):
		return self.__name

	
>>> a=New()
>>> a.func()
'小鱼酱'
>>> a._New__name#其实python的私有机制是伪私有,可以通过这种方式访问私有变量
'小鱼酱'
>>> 

组合:把类的实例化给放到新类里面,这样就把旧类组合进去了

class Turtle:
    def __init__(self,x):
        self.num=x
class Fish:
    def __init__(self,x):
        self.num=x
class Pool:
    def __init__(self,x,y):
        self.turtle=Turtle(x)#turtle是乌龟的实例化对象
        self.fish=Fish(y)#fish是小鱼的实例化对象
    def print_num(self):
        print("水池里总共乌龟有%d只,小鱼%d只"% (self.turtle.num,self.fish.num))

>>> pool=Pool(1,10)
>>> pool.print_num()
水池里总共乌龟有1只,小鱼10

什么是绑定?
python严格要求方法需要有实例才能被调用,这种限制其实就是python所谓的绑定概念。

一些与类相关的BIF:

  • issubclass(class,classinfo)如果class是classinfo的一个子类,那么返回True,注意:一个类被认为是其自身的子类,classinfo可以是类对象组成的元组,只要class是其中任何一个候选的子类,则返回True。所有类默认继承自object。
  • isinstance(object,classinfo)用来检查一个实例对象是否属于一个类,第一个参数是实例对象,第二个参数类,同样第二个参数也可以是元组,元组里面有多个类,属于则返回True否则返回False
  • hasattr(object,name)用来测试一个对象里面是否有指定的属性,第一个参数是对象,第二个参数是指定的属性名,注意:要检查的属性名要用字符串括起来,否则编译器会将其认为变量可能引发异常
  • getattr(object,name[,default])用来返回对象指定的属性值,如果属性不存在同时又没有设置default的值,那么她会抛出异常,如果有设置default的值则会打印default的值。
  • setattr(object,name,value)用来设置对象中指定属性的值,如果属性不存在,它会新建这个属性并且给他赋值,属性同样要加单引号。
  • delattr(object,name)用来删除对象中指定的属性,如果属性不存在则抛出异常。
  • property(fget=None,fset=None,fdel=None,doc=None)是用来通过属性设置属性,返回值是一个属性。第一个参数是获得属性的方法,第二个参数是设置属性的方法,第三个参数是删除属性的方法。使用如下图:
    在这里插入图片描述小甲鱼干货
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值