Python学习进阶——Part2

2-5 File(文件)方法

1) open()方法

  • 用于打开一个文件,并返回文件对象,在对文件进行处理过程都需要使用到这个函数,如果该文件无法被打开,会抛出 OSError

    • 使用 open() 方法一定要保证关闭文件对象,即调用 close() 方法
  • open() 函数常用形式是接收两个参数:文件名(file)和模式(mode)。

    open(file, mode='r')
    
    • 完整的语法格式为:
    open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True, opener=None)
    
    • 参数说明:

      • file: 必需,文件路径(相对或者绝对路径)。

      • mode: 可选,文件打开模式

      • buffering: 设置缓冲

      • encoding: 一般使用utf8

      • errors: 报错级别

      • newline: 区分换行符

      • closefd: 传入的file参数类型

      • opener: 设置自定义开启器,开启器的返回值必须是一个打开的文件描述符。

  • mode 参数

模式描述
t文本模式 (默认)。
x写模式,新建一个文件,如果该文件已存在则会报错。
b二进制模式。
+打开一个文件进行更新(可读可写)。
U通用换行模式(Python 3 不支持)。
r以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。
rb以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。这是默认模式。一般用于非文本文件如图片等。
r+打开一个文件用于读写。文件指针将会放在文件的开头。
rb+以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。一般用于非文本文件如图片等。
w打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。
wb以二进制格式打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。一般用于非文本文件如图片等。
w+打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。
wb+以二进制格式打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。一般用于非文本文件如图片等。
a打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
ab以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
a+打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。
ab+以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写。
  • 默认为文本模式,如果要以二进制模式打开,加上b

2) file 对象

file 对象使用 open 函数来创建,下表列出了 file 对象常用的函数:

序号方法及描述
1file.close()关闭文件。关闭后文件不能再进行读写操作。
2file.flush()刷新文件内部缓冲,直接把内部缓冲区的数据立刻写入文件, 而不是被动的等待输出缓冲区写入。
3file.fileno()返回一个整型的文件描述符(file descriptor FD 整型), 可以用在如os模块的read方法等一些底层操作上。
4file.isatty()如果文件连接到一个终端设备返回 True,否则返回 False。
5file.next()**Python 3 中的 File 对象不支持 next() 方法。**返回文件下一行。
6[file.read(size])从文件读取指定的字节数,如果未给定或为负则读取所有。
7[file.readline(size])读取整行,包括 “\n” 字符。
8[file.readlines(sizeint])读取所有行并返回列表,若给定sizeint>0,返回总和大约为sizeint字节的行, 实际读取值可能比 sizeint 较大, 因为需要填充缓冲区。
9[file.seek(offset, whence])移动文件读取指针到指定位置
10file.tell()返回文件当前位置。
11[file.truncate(size])从文件的首行首字符开始截断,截断文件为 size 个字符,无 size 表示从当前位置截断;截断之后后面的所有字符被删除,其中 windows 系统下的换行代表2个字符大小。
12file.write(str)将字符串写入文件,返回的是写入的字符长度。
13file.writelines(sequence)向文件写入一个序列字符串列表,如果需要换行则要自己加入每行的换行符。

2-6 OS文件/ 目录方法

参考:菜鸟教程:OS文件/ 目录方法

2-7 错误和异常

1. 异常处理

1) try/except

img

while True:
    try:
        x = int(input("请输入一个数字: "))
        break
    except ValueError:
        print("您输入的不是数字,请再次尝试输入!")
  • try 语句按照如下方式工作;

    • 首先,执行 try 子句(在关键字 try 和关键字 except 之间的语句)。
    • 如果没有异常发生,忽略 except 子句,try 子句执行后结束。
    • 如果在执行 try 子句的过程中发生了异常,那么 try 子句余下的部分将被忽略。如果异常的类型和 except 之后的名称相符,那么对应的 except 子句将被执行。
    • 如果一个异常没有与任何的 except 匹配,那么这个异常将会传递给上层的 try 中。
  • 一个except子句可以同时处理多个异常,这些异常将被放在一个括号里成为一个元组

    • except (RuntimeError, TypeError, NameError):
          pass
      
  • 最后一个except子句可以忽略异常的名称,它将被当作通配符使用。你可以使用这种方法打印一个错误信息,然后再次把异常抛出。

    • import sys
      
      try:
          f = open('myfile.txt')
          s = f.readline()
          i = int(s.strip())
      except OSError as err:
          print("OS error: {0}".format(err))
      except ValueError:
          print("Could not convert data to an integer.")
      except:
          print("Unexpected error:", sys.exc_info()[0])
          raise
      

2) try/except…else

img

  • 使用 else 子句比把所有的语句都放在 try 子句里面要好,这样可以避免一些意想不到,而 except 又无法捕获的异常。

    • >>> def this_fails():
              x = 1/0
         
      >>> try:
              this_fails()
          except ZeroDivisionError as err:
              print('Handling run-time error:', err)
         
      Handling run-time error: int division or modulo by zero
      

3) try/finally

img

  • finally 语句无论异常是否发生都会执行

    • try:
          runoob()
      except AssertionError as error:
          print(error)
      else:
          try:
              with open('file.log') as file:
                  read_data = file.read()
          except FileNotFoundError as fnf_error:
              print(fnf_error)
      finally:
          print('这句话,无论异常是否发生都会执行。')
      

2. 抛出异常

  • 使用 raise 语句抛出一个指定的异常。

  • raise语法格式如下:

    • raise [Exception [, args [, traceback]]]
    • img
  • x = 10
    if x > 5:
        raise Exception('x 不能大于 5。x 的值为: {}'.format(x))
     
    输出
    Traceback (most recent call last):
      File "test.py", line 3, in <module>
        raise Exception('x 不能大于 5。x 的值为: {}'.format(x))
    Exception: x 不能大于 5。x 的值为: 10
    

2-8 面向对象

1. 面向对象技术简介

  • 概念
    • 类(Class): 用来描述具有相同的属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法。对象是类的实例。
    • **方法:**类中定义的函数。
    • **类变量:**类变量在整个实例化的对象中是公用的。类变量定义在类中且在函数体之外。类变量通常不作为实例变量使用。
    • **数据成员:**类变量或者实例变量用于处理类及其实例对象的相关的数据。
    • **方法重写:**如果从父类继承的方法不能满足子类的需求,可以对其进行改写,这个过程叫方法的覆盖(override),也称为方法的重写。
    • **局部变量:**定义在方法中的变量,只作用于当前实例的类。
    • **实例变量:**在类的声明中,属性是用变量来表示的,这种变量就称为实例变量,实例变量就是一个用 self 修饰的变量。
    • **继承:**即一个派生类(derived class)继承基类(base class)的字段和方法。继承也允许把一个派生类的对象作为一个基类对象对待。例如,有这样一个设计:一个Dog类型的对象派生自Animal类,这是模拟"是一个(is-a)"关系(例图,Dog是一个Animal)。
    • **实例化:**创建一个类的实例,类的具体对象。
    • **对象:**通过类定义的数据结构实例。对象包括两个数据成员(类变量和实例变量)和方法。
  • 和其它编程语言相比,Python 在尽可能不增加新的语法和语义的情况下加入了类机制。
  • Python中的类提供了面向对象编程的所有基本功能:类的继承机制允许多个基类,派生类可以覆盖基类中的任何方法,方法中可以调用基类中的同名方法。
  • 对象可以包含任意数量和类型的数据。

2. 面向对象操作

1) 类定义/对象

class Car():
    def __init__(self, make, modle, year):
        # self代表类的实例,而非类
        self.make = make
        self.modle = modle
        self.year = year
        self.mileage = 0.0
    
    def describe(self):
        print("{}年,{}品牌的{}产生了!".format(self.year, self.modle, self.make))

    def get_mileage(self):
        print("这个车已经跑了{:5}公里!".format(self.mileage))

    def set_mileage(self, mileage):
        # 对属性修改进行限制
        if self.mileage < mileage:
            self.mileage = mileage

2) 类继承

# ...
class Ben(Car):
    def __init__(self, make, modle, year, found):
        super().__init__(make, modle, year)
        # or
        # Car.__init__(self, make, modle, year)
        self.found = found

    def what(self):
        print("I am {}, found by {} in {}".format(self.make, self.found, self.year))

3) 多继承

class DerivedClassName(Base1, Base2, Base3):
    <statement-1>
    .
    .
    .
    <statement-N>
  • 需要注意圆括号中父类的顺序,若是父类中有相同的方法名,而在子类使用时未指定,python从左至右搜索 即方法在子类中未找到时,从左到右查找父类中是否包含方法。

4) 类属性与方法

  • 类的私有属性
    • __private_attrs:两个下划线开头,声明该属性为私有,不能在类的外部被使用或直接访问。在类内部的方法中使用时 self.__private_attrs
  • 类的私有方法
    • __private_method:两个下划线开头,声明该方法为私有方法,只能在类的内部调用 ,不能在类的外部调用。self.__private_methods

2-9 命名空间和作用域

1. 命名空间(namespace)

  • 命名空间(namespace)是从名称到对象的映射,大部分的命名空间都是通过Python字典来实现的
  • 命名空间提供了在项目中避免名字冲突的一种方法。各个命名空间是独立的,没有任何关系的,所以一个命名空间中不能有重名,但不同的命名空间是可以重名而没有任何影响。
  • 三种命名空间:
    • 内置名称(built-in names), Python 语言内置的名称,比如函数名 abs、char 和异常名称 BaseException、Exception 等等。
    • 全局名称(global names),模块中定义的名称,记录了模块的变量,包括函数、类、其它导入的模块、模块级的变量和常量。
    • 局部名称(local names),函数中定义的名称,记录了函数的变量,包括函数的参数和局部定义的变量。(类中定义的也是)
    • img

2. 作用域

  • 作用域就是一个 Python 程序可以直接访问命名空间的正文区域。
  • Python 中,程序的变量并不是在哪个位置都可以访问的,访问权限决定于这个变量是在哪里赋值的。
  • 四种作用域:
    • L(Local):最内层,包含局部变量,比如一个函数/方法内部。
    • E(Enclosing):包含了非局部(non-local)也非全局(non-global)的变量。比如两个嵌套函数,一个函数(或类) A 里面又包含了一个函数 B ,那么对于 B 中的名称来说 A 中的作用域就为 nonlocal。
    • G(Global):当前脚本的最外层,比如当前模块的全局变量。
    • B(Built-in): 包含了内建的变量/关键字等,最后被搜索。
    • 规则顺序: L –> E –> G –> B
    • img

3. global和nonlocal关键字

  • 修改全局变量(global):

    • e.g.

    • num = 1
      def fun1():
          global num  # 需要使用 global 关键字声明
          print(num) 
          num = 123
          print(num)
      fun1()
      print(num)
      
      输出
      1
      123
      123
      
  • 修改嵌套作用域(enclosing 作用域,外层非全局作用域)中的变量(nonlocal):

    • e.g.

    • def outer():
          num = 10
          def inner():
              nonlocal num   # nonlocal关键字声明
              num = 100
              print(num)
          inner()
          print(num)
      outer()
      
      输出
      100
      100
      
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Bayyys

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值