Python 基础入门笔记———— 文件操作面向对象异常模块包

Posted Xiu Yan

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python 基础入门笔记———— 文件操作面向对象异常模块包相关的知识,希望对你有一定的参考价值。

文章目录


一、文件操作

1.1 文件的基本操作

1.1.1 打开

打开文件操作步骤:

  1. 打开文件
  2. 读写等操作
  3. 关闭文件

用 open 函数,打开已经存在的文件,或者创建一个新文件,语法: open(name, mode)

  • name:是要打开的目标文件名的字符串(可以包含文件所在的具体路径)。
  • mode:设置打开文件的模式(访问模式):只读、写入、追加等。

1.1.2 打开文件模式

模式描述
r以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。
rb以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。这是默认模式。
r+打开一个文件用于读写。文件指针将会放在文件的开头。
rb+以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。
w打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。
wb以二进制格式打开一个文件只用于写入。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。
w+打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。
wb+以二进制格式打开一个文件用于读写。如果该文件已存在则打开文件,并从开头开始编辑,即原有内容会被删除。如果该文件不存在,创建新文件。
a打开一个文件用于追加。如果该文件已存在、文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
ab以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
a+打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。
ab+以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写。

注意:

  • 基本模式有:r w a,其他的模式是在其基础上泛生而来。
  • 模式中带有 b,代表二进制。模式中带有 +,代表可读可写。

示例1:

# r: 如果文件不存在,则报错:不支持写入操作,表示只读
f = open('test.txt', 'r')
# f = open('test1.txt', 'r')  # 文件不存在,报错
# f.write('aa')  # 报错
con = f.read()
print(con)
f.close()

# w:只写,如果文件不存在,新建文件:执行写入,会覆盖原有内容
f = open('text1.txt', 'w')
f.write('bbb')
f.close()

# a:追加,如果文件不存在,新建文件:在原有内容基础上,追加新内容
f = open('test.txt', 'a')
f.write('lalala')
f.close()

# 访问模式参数可以省略,如果省略表示访问模式为 r
f = open('text.txt')
f.close()

示例2:

# w+:没有该文件会新建;w 特点,文件指针在开头,用新内容覆盖原内容
# 如果只读不写,文件内容会空
f = open('test.txt', 'w+')
f.write("haha")  # 此时文件新内容覆盖原内容,文件指针在末尾
con = f.read()  # 因此接着读,将不会读出内容
print(con)
f.close()

1.1.3 文件对象方法

1.1.3.1 写

语法: 文件对象.write( '内容')

# 1. 打开文件
f = open('test.txt', 'w')
# 2.文件写入
f.write('hello world')
# 3. 关闭文件
f.close()

注意:

  1. w 和 a 模式:如果文件不存在则创建该文件如果文件存在,w 模式先清空再写入,a 模式直接末尾追加。
  2. r 模式:如果文件不存在则报错。

1.1.3.2 读

  • 设 test.txt 文件中内容如下:

  • read()

    语法: 文件对象.read( num)
    num 表示要从文件中读取的数据的长度(单位是字节),如果没有传入 num,那么就表示读取文件中所有的数据。

    f = open('test.txt', 'r')
    # 换行符 \\n 会有字节占位
    # read 不写参数表示读取所有
    print(f.read())
    print(f.read(4))  # 此时文件的指针在末尾, 所以不会读取任何数据
    f.close()
    

    结果如下:

  • readlines()

    readlines 可以按照行的方式把整个文件中的内容进行一次性读取,并且返回的是一个列表,其中每一行的数据为一个元素。

    f = open('test.txt', 'r')
    con = f.readlines()
    print(con)  # ['aaa\\n', 'bbb\\n', 'ccc']
    f.close()
    
  • readline()
    readline 每次打印一行数据,文件指针会后移。

    f = open('test.txt', 'r')
    con = f.readline()
    print(f'第⼀⾏:con')
    con = f.readline()
    print(f'第二⾏:con')
    con = f.readline()
    print(f'第三⾏:con')
    f.close()
    

    结果如下:


1.1.2.3 seek()

作用: 用来移动文件指针

语法: 文件对象.seek(偏移量,起始位置)

起始位置: 0:文件开头 1:当前位置  2:文件结尾

f = open('test.txt', 'r+')
f.seek(2, 0)  # 开头偏移两个字符
con = f.read()
print(con)
f.close()

结果如下:


1.1.4 关闭

文件对象.close()


1.2 文件备份

备份文件步骤:

  1. 接收用户输入的文件名
  2. 规划备份文件名
  3. 备份文件写入数据

代码如下:

# 1. 用户输入目标文件名字 
old_name = input('请输入要备份的文件名:')

# 2. 规划备份文件的名字
# 2.1 提取目标文件后缀
index = old_name.rfind('.')  # 从右侧找 '.',如:sound.txt.mp3  是 mp3 文件类型

if index > 0: # 限制文件格式为 “xxx.后缀” 才可备份 
    postfix = old_name[index:]

# 2.2 组织备份文件名, xx[备份]后缀
new_name = old_name[:index] + '[备份]' + postfix

# 3. 备份文件写入数据(数据和原文件一样)
# 3.1 打开 原文件 和 备份文件
old_f = open(old_name, 'rb')  # 以二进制打开
new_f = open(new_name, 'wb')

# 3.2 原文件读取,备份文件写入
# 如果不确定目标文件大小,循环读取写入,当读取出来的数据没有了则终止循环
while True:
    con = old_f.read(1024)
    if len(con) == 0:
        break
    new_f.write(con)

# 3.2 关闭文件
old_f.close()
new_f.close()

1.3 文件和文件夹操作

在 Python 中文件和文件夹的操作要借助 os 模块里面的相关功能。

导入 os 模块:import os

1.3.1 文件/文件夹重命名

os.rename(目标文件名,新文件名)

1.3.2 删除文件

os.remove(目标文件名)

1.3.3 创建文件夹

os.mkdir(文件夹名字)

1.3.4 删除文件夹

os.rmdir(文件夹名字)

1.3.5 获取当前目录

os.getcwd()

1.3.6 改变默认目录

os.chdir(目录)

1.3.7 获取目录列表

os.listdir(⽬目录)

应用:批量重命名

# flag = 1:把文件夹所有文件重命名 python-xxx
# flag = 2:删除python-重命名

import os

# 构造内置条件的数据
flag = 2

# 1. 找到所有文件:获取文件夹的目录列表
file_list = os.listdir()
print(file_list)

# 2. 重构名字
for i in file_list:
    if flag == 1:
        new_name = 'python-' + i
    elif flag == 2:
        num = len('python-')
        new_name = i[num:]

	# 3. 重命名
    os.rename(i, new_name)

二、面向对象基础

2.1 面向对象的实现方法

2.1.1 定义类

语法:

class 类名():
	代码
	......

注意: 类名遵循大驼峰命名习惯,即首字母大写

扩展

2.1.2 创建对象

语法: 对象名 = 类名()

注意: 创建对象的过程也叫实例化对象。

2.1.3 self

self 指的是调用该函数的对象。

示例:

# 定义洗衣机类
class Washer():
    def wash(self):
        print("洗衣服")
        print(self)

# 创建对象
haier1 = Washer()
print(haier1)  # <__main__.Washer object at 0x000001455A806D70>

# 使用实例方法
haier1.wash()  # 洗衣服
               # <__main__.Washer object at 0x000001455A806D70>
               # self 指的是调用该函数的对象
               # self 和 对象得到的结果是一致的,都是当前对象的内存中存储地址。

# 创建两个对象
haier2 = Washer()  # 不同对象存储地址不一样
print(haier2)

2.2 添加和获取对象属性

添加对象属性的方式有两种:类外面添加、类里面添加

  1. 类外面添加和获取对象属性

    语法:对象名.属性名

  2. 类里面添加获取对象属性

    语法:self.属性名

示例:

class Washer():
	def __init__(self):
        self.height = 300  # 类内 添加属性,一般在 __init()__ 方法中添加类内属性,即实例属性
        
    def print_info(self):
        print(f'洗衣机的宽度:self.width')  # 类内 获取属性

haier = Washer()
haier.width = 400  # 类外 添加属性
print(f'洗衣机的宽度:haier.width')  # # 类外 获取属性

haier.print_info()

2.3 魔法方法

__xx__() 的函数叫做魔法方法,指的是具有特殊功能的函数。

2.3.1 init()

__init__() 方法的作用:初始化对象,分为带参数和不带参数两种。

  1. 不带参数:

    class Washer():
        # __init__ 初始化
        def __init__(self):
            self.width = 400
            self.height = 400
    
        def print_info(self):
            print(f'洗衣机的宽度:self.width')  # 洗衣机的宽度:400
            print(f'洗衣机的宽度:self.width')  # 洗衣机的宽度:400
    
    haier = Washer()
    haier.print_info()
    
  2. 带参数:

    class Washer():
        # 带参数__init__ 初始化
        def __init__(self, width, height):
            self.width = width
            self.height = height
    
        def print_info(self):
            print(f'洗衣机的宽度:self.width')  # 洗衣机的宽度:100
            print(f'洗衣机的宽度:self.width')  # 洗衣机的宽度:200
    
    haier1 = Washer(100,200)
    haier1.print_info()
    
    # haier2 = Washer()  # 报错
    

注意︰

  1. __init__() 方法,在创建一个对象时默认被调用,不需要手动调用
  2. __init__(self) 中的 self 参数,不需要开发者传递,python解释器会自动把当前的对象引用传递过去。

2.3.2 str()

当使用 print 输出对象的时候,默认打印对象的内存地址。如果类定义了__str__方法,那么就会打印从在这个方法中 return 的数据。

示例:

class Washer():
    def __str__(self):
        return '洗衣机类的解释说明'

haier1 = Washer()
print(haier1)  # 洗衣机类的解释说明

2.3.3 del()

当删除对象时,解释器也会默认调用 __del__() 方法。

class Washer():
    def __del__(self):
       print('删除')

haier = Washer()
del haier  # 删除

三、面向对象继承

3.1 旧式类与新式类

  • 经典类或旧式类:

    不由任意内置类型派生出的类,称之为经典类。

    class类名:
    	代码
    	......
    
  • 新式类:
    Python中,所有类默认继承 object 类,object 类是顶级类或基类,其他子类叫做派生类。

    class类名(object):
    	代码
    	......
    

3.2 单继承

# 父类 A
class A(object):
    def __init__(self):
        self.num = 1

    def info_print(self):
        print(self.num)

# 子类 B
class B(A):
    pass  # 作用是省略

result = B()
result.info_print()  # 1
print(result.num)  # 1

3.3 多继承

多继承:一个类同时继承了多个父类。

# 父类A
class A(object):
    def __init__(self):
        self.num_a = 1

    def info_print(self):
        print(f'A类:self.num_a')

# 父类B
class B(object):
    def __init__(self):
        self.num_a = 2

    def info_print(self):
        print(f'B类:self.num_a')

# 子类
class C(A, B):
    pass

cc = C()
print(cc.num_a)  # 1
cc.info_print()  # A类:1

注意:

  1. 如果一个类继承多个父类,默认使用第一个父类的同名属性和方法
  2. 单继承中,子类默认继承父类的所有属性和方法
  3. 多继承中,子类继承第一个父类的所有属性和所有类的方法
  4. 两种继承方式子类都可以重写父类属性和方法

如:

# 父类A
class A(object):
    def __init__(self):
        self.num_a = 1
        self.num_aa = 2

    def info_print(self):
        print(f'A类:self.num_a')

# 父类B
class B(object):
    def __init__(self):
        self.num_a = 3
        self.num_b = 4

    def info_print(self):
        print(f'B类:self.num_a')

    def info_print2(self):
        print(f'B类:self.num_a')

# 子类
class C(A, B):
    pass

cc = C()
 # vars(object):返回对象的属性
print(vars(cc)) # 'num_a': 1, 'num_aa': 2
print(cc.num_a)   # 1
print(cc.num_aa)  # 2  -- 第一个父类特有的属性
# print(cc.num_b)   # 报错  -- 第二个父类特有的属性
cc.info_print()   # A类:1  
cc.info_print2()   # B类:1  -- 第二个父类特有的方法

3.4 子类重写父类同名方法和属性

如果一个类继承多个父类,子类会调用子类同名属性和方法

# 父类A
class A(object):
    def __init__(self):
        self.num = 1

    def info_print(self):
        print(f'A父类:self.num')

# 父类B
class B(object):
    def __init__(self):
        self.num = 2

    def info_print(self):
        print(f'B父类:self.num')

# 子类
class C(A, B):
    def __init__(self):
        self.num = 33

    def info_print(self):
        print(f'子类:self.num')


cc = C()
print(cc.num)  # 33
cc.info_print()  # 子类:33

print(C.__mro__)  # 通过__mro__方法来获取这个类的调用顺序
# (<class '__main__.C'>, <class '__main__.A'>, <class '__main__.B'>, <class 'object'>)

3.5 子类调用父类同名方法和属性

# 父类 A
class A(object):
    def __init__(self):
        self.num = 11

    def info_print(self):
        print(f'A父类:self.num')

# 父类 B
class B(object):
    def __init__(self):
        self.num = 22

    def info_print(self):
        print(f'B父类:self.num')

# 子类 C
# 父类A
class A(object):
    def __init__(self):
        self.num = 11

    def info_print(self):
        print(f'A父类:self.num')

# 父类B
class B(object):
    def __init__(self):
        self.num = 22

    def info_print(self):
        print(f'B父类:self.num')

# 子类C
class C(A, B)Python 基础入门笔记———— 文件操作面向对象异常模块包

python-基础入门-3(对文件操作)

课堂笔记:Python基础-文件操作

Python新手入门基础英文笔记

python学习笔记-面向对象基础

Python3入门基础教程