文件的读写操作(备份,批量操作文件)

随后的代码,使用狗类进行演示说明
类名: Dog(狗类)
属性:
    姓名 name
    年龄 age
    ....
方法:
    吃  eat()
    玩  play()
    .....1、文件的读操作

read() :一次性全部读取,读到文件末尾会返回空

read(10) :一次读取10个字节

# 1、打开文件
f = open('a.txt', 'r', encoding='UTF-8')
# 2、读写文件,文件对象.read(n)  n  一次读取多少字节的内容,默认不写,读取全部内容
buf = f.read(3)
#  buf = f.read()  不写的话,默认是一次性全部读取
print(buf)  # 123
print('='*30)
buf = f.read(3)
print(buf)
# 4
# 5    因为\n会占据一个位置
# 3、关闭文件
f.close()

2、按行读取文件



readline()  :一次读取一行信息,返回值是读取到的内容(str)

readlines() :按行读取,一次读取所有行,返回值是列表,列表中的每一项是一个字符串,及一行的内容

f = open('a.txt', 'r', encoding='utf-8')
# f.readline()  # 一次读取一行内容,返回值是读取到的内容(str)
# buf = f.readline()
# print(buf)
# buf = f.readline()
# print(buf)
'''
1234

5678
中间会有一行空行
'''

# f.readlines()  # 按行读取,一次读取所有行,返回值是列表,列表中的每一项是一个字符串,及一行的内容
buf = f.readlines()
print(buf)  # ['1234\n', '5678']
buf = [i.strip() for i in buf]  # 去掉中间的空格
print(buf)  # ['1234', '5678']
f.close()

 3、模拟读取大文件

方法一:读一行

f = open('a.txt', 'r', encoding='utf-8')
while True:
    buf = f.readline()
    if buf:  # if len(buf) > 0 容器,可以直接作为判断条件,容器中有内容,为True,没有内容为False
        print(buf, end='')
        '''
        1234
        5678'''
    else:
        # 文件读完了
        break

f.close()

方法二:一次读五个字节

f = open('a.txt', 'r', encoding='utf-8')
while True:
    buf = f.read(5)  # f.read(4096)  相当于是4k,里面可以随便写的
    if buf:
        # print(buf, end='')
        print(buf)
    else:
        break

f.close()

4、以二进制的方式操作文件

.encode()  ====>  将我们认识的转换为二进制的字符串

.decode()  ====> 将二进制转换为我们认识的

f = open('c.txt', 'wb')  # 因为是以二进制的方式打开,所以不用写encoding,与中文无关了
f.write('你好!'.encode())  # encode() 将str转换为二进制格式的字符串
f.close()


f1 = open('c.txt','rb')
buf = f1.read()
print(buf)  # b'\xe4\xbd\xa0\xe5\xa5\xbd\xef\xbc\x81'  二进制形式下的你好!
print(buf.decode())  # 你好!
f1.close()

 文件的读写操作(备份,批量操作文件)_第1张图片


计算机只认识 0 和 1 , 
进制: 
    二进制, 只有 0 和 1 组成,逢二进一
    十进制, 0 1 2 3 4 5 6 7 8 9 , 逢十进一
    十六进制, 0 1 2 3 4 5 6 7 8 9 A B C D E F 逢十六进一
计算机最小的单位是 bit(位), 只有两个数据值 0 和 1 
字节: 是计算机中基本的储存单位 byte 
    1 byte = 8 bit
1KB = 1024 byte
1MB = 1024 KB
1GB = 1024 MB
1TB = 1024 GB
...

100Mbits  200Mbits
12.5MB/s  25MB/s


文件的读写操作(备份,批量操作文件)_第2张图片


文本文件: txt, .py .md  能够使用记事本打开的文件
二进制文件: 具有特殊格式的文件, mp3 mp4 rmvb avi png jpg 等
    
文本文件可以使用 文本方式打开文件,也可以使用二进制的方式打开文件

二进制文件,只能使用二进制的方式打开文件
二进制打开方式如下: 不管读取,还是书写,都需要使用二进制的数据
rb wb  ab
注意点: 不能指定 encoding 参数


 文件的读写操作(备份,批量操作文件)_第3张图片

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

5、文件备份

步骤:

1. 用只读的方式,打开文件
2. 读取文件内容
3. 关闭文件
4. 只写的方式,打开新文件
5. 将 第 2 步读取的内容写入新文件
6. 关闭新文件

思考:
    1. 如果文件比较大,循环读取文件
    2. 复制备份的文件可能是 txt 文件,可能是 二进制文件,  ---> 使用二进制方式打开文件

在找文件后缀时,需要倒着找,以免出现在名字中带点的情况(比如:"aaa.bb.c.txt")

# 1.用只读的方式,打开文件
f = open('a.txt', 'rb')
# 2.读取文件内容
buf = f.read()
# 3.关闭文件
f.close()
# 4.只写的方式,打开新文件
f_w = open('a[备份].txt', 'wb')
# 5.将第2步读取的内容写入到新文件
f_w.write(buf)
# 6.关闭文件
f_w.close()

可以利用切片技术来修改名字,截取需要的部分

优化版: 

file_name = input('请输入要备份的文件名:')

# 1.用只读的方式,打开文件
f = open(file_name, 'rb')
# 2.读取文件内容
buf = f.read()
# 3.关闭文件
f.close()

# 根据原文件名,找到文件后缀和文件名
index = file_name.rfind('.')
# 后缀 file.name[index:]
# 新文件名
new_file_name = file_name[:index] + '[备份1]' + file_name[index:]
print(new_file_name)
# 4. 只写的方式,打开新文件
f_w = open(new_file_name, 'wb')
# 5. 将 第 2 步读取的内容写入新文件
f_w.write(buf)
# 6. 关闭新文件
f_w.close()

 6、文件和目录的操作

# 对于文件和目录的操作,需要导入os模块
import os

# 对于文件和目录的操作,需要导入os模块
import os


# 1. 文件重命名 os.rename(原文件路径名, 新文件路径名)
# os.rename('a.txt', 'aa.txt')
# 2. 删除文件 os.remove(文件的路径名)
# os.remove('aa.txt')
# 3. 创建目录 os.mkdir(目录路径名)  make directory
# os.mkdir('test')
# os.mkdir('test/aa')


# 4、 删除空目录,  os.rmdir remove directory
# os.rmdir('test/aa')
# 5、 获取当前所在的目录  os.getcwd()     get current working directory
buf = os.getcwd()
print(buf)

# 6、 修改当前的目录 os.chdir(目录名)  change dir  进入另一个目录
os.chdir('test')
buf = os.getcwd()
print(buf)

# 7. 获取指定目录中的内容,  os.listdir(目录), 默认不写参数,是获取当前目录中的内容
# 返回值是列表, 列表中的每一项是文件名
buf = os.listdir()

# 对于文件和目录的操作,需要导入os模块
import os


# 1. 文件重命名 os.rename(原文件路径名, 新文件路径名)
# os.rename('a.txt', 'aa.txt')
# 2. 删除文件 os.remove(文件的路径名)
# os.remove('aa.txt')
# 3. 创建目录 os.mkdir(目录路径名)  make directory
# os.mkdir('test')
# os.mkdir('test/aa')


# 4、 删除空目录,  os.rmdir remove directory
# os.rmdir('test/aa')
# 5、 获取当前所在的目录  os.getcwd()     get current working directory
buf = os.getcwd()
print(buf)

# 6、 修改当前的目录 os.chdir(目录名)  change dir  进入另一个目录
os.chdir('test')
buf = os.getcwd()
print(buf)

# 7. 获取指定目录中的内容,  os.listdir(目录), 默认不写参数,是获取当前目录中的内容
# 返回值是列表, 列表中的每一项是文件名
buf = os.listdir()
print(buf)  # ['aa']

7、批量修改文件名

我们可以进入下一层目录,但在最后时要注意返回原来的目录,方便后续操作

可以批量创建文件,修改文件名(添加信息与删除信息)

import os


def create_files():
    for i in range(10):
        file_name = 'test/file_' + str(i) + '.txt'
        print(file_name)
        f = open(file_name, 'w')
        f.close()


def create_files_1():
    os.chdir('test')
    for i in range(10, 20):
        file_name = 'file_' + str(i) + '.txt'
        print(file_name)
        f = open(file_name, 'w')
        f.close()
    os.chdir('../')  # 返回上一级文件目录


def modify_filename():
    os.chdir('test')
    buf_list = os.listdir()
    # print(buf_list)
    for file in buf_list:
        new_file = '名之以父_' + file  # 加前缀了
        os.rename(file, new_file)

    os.chdir('../')


def modify_filename_1():
    os.chdir('test')
    buf_list = os.listdir()
    # print(buf_list)
    for file in buf_list:
        num = len('名之以父_')
        new_file = file[num:]  # 去掉前缀
        os.rename(file, new_file)

    os.chdir('../')


# create_files()
# create_files_1()
modify_filename()
# modify_filename_1()

文件的读写操作(备份,批量操作文件)_第4张图片

 8、学生管理系统文件版

加入了save() 方法和load_file() 方法

一个在退出系统时执行,一个只执行一次

学生管理系统
{'name': 'isaac', 'age': 18, 'gender': m}

[{}, {}]
需要将所有的学生信息保存的到文件中.最简单的的方法,是将整个列表保存到文件中
'[{}, {}, {}]'   
w

'[{}, {}, {}]'   ---> [{}, {}, {}]
eval()

import os

# 定义学生列表,保存所有的学生信息
stu_list = []


def show_menu():
    print('1. 添加学生')
    print('2. 删除学生')
    print('3. 修改学生信息')
    print('4. 查询单个学生信息')
    print('5. 查询所有的学生信息')
    print('6. 退出系统')


def insert_student():
    # 1. 通过 input 函数获取学生的信息, 姓名, 年龄, 性别
    name = input('请输入学生名字:')
    # [{}, {}, {}]  判断的是字典中的 value 是否存在
    for stu in stu_list:
        if stu['name'] == name:
            print('----------学生信息存在---------')
            return  # 结束函数的执行

    age = input('请输入学生年龄:')
    gender = input('请输入学生性别:')
    # 2. 将学生信息转换为字典进行保存
    stu_dict = {'name': name, 'age': int(age), 'gender': gender}
    # 3. 将这个学生字典添加的列表中
    stu_list.append(stu_dict)
    print('==============学生信息添加成功====================')


def remove_student():
    # 1. 使用 input 获取要删除 /修改/查询 的学生姓名
    name = input('请输入要操作的学生的名字:')
    # 2. 判断学生信息是否存在
    for stu in stu_list:
        if stu['name'] == name:
            # 3. 学生存在,对学生进行 删除 /修改/查询 操作
            stu_list.remove(stu)
            # return
            break
    # 4. 学生信息不存在,直接结束
    else:
        print('***********该学生信息不存在,无法删除**************')


def modify_student():
    # 1. 使用 input 获取要删除 /修改/查询 的学生姓名
    name = input('请输入要操作的学生的名字:')
    # 2. 判断学生信息是否存在
    for stu in stu_list:
        if stu['name'] == name:
            # 3. 学生存在,对学生进行 删除 /修改/查询 操作
            stu['age'] = int(input('请输入新的年龄:'))
            # return
            break
    # 4. 学生信息不存在,直接结束
    else:
        print('***********该学生信息不存在,无法修改**************')


def search_student():
    # 1. 使用 input 获取要删除 /修改/查询 的学生姓名
    name = input('请输入要操作的学生的名字:')
    # 2. 判断学生信息是否存在
    for stu in stu_list:
        if stu['name'] == name:
            # 3. 学生存在,对学生进行 删除 /修改/查询 操作
            print(f'姓名:{stu["name"]}, 年龄:{stu["age"]}, 性别:{stu["gender"]}')
            # return
            break
    # 4. 学生信息不存在,直接结束
    else:
        print('***********该学生信息不存在**************')


def show_all_info():
    if len(stu_list) > 0:
        for stu in stu_list:
            print(f'姓名:{stu["name"]}, 年龄:{stu["age"]}, 性别:{stu["gender"]}')
            # print(stu)
    else:
        print('目前没有学生信息')


def save():
    # 1. 打开文件
    f = open('student.txt', 'w', encoding='utf-8')
    f.write(str(stu_list))
    f.close()


def load_file():  # 读取加载文件
    global stu_list
    if os.path.exists('student.txt'):
        f = open('student.txt', 'r', encoding='utf-8')
        buf = f.read()
        if buf:  # 判断是否是空列表,如果是空列表的话,就无法进行下面的操作
            stu_list = eval(buf)  # 一旦使用等号了,就必须要声明全局变量了,引用改变了!!!
        f.close()


def main():
    load_file()  # 只执行一次
    while True:
        show_menu()
        opt = input('请输入用来选择的操作编号:')
        if opt == '1':
            # print('1. 添加学生')
            insert_student()
        elif opt == '2':
            # print('2. 删除学生')
            remove_student()
        elif opt == '3':
            # print('3. 修改学生信息')
            modify_student()
        elif opt == '4':
            # print('4. 查询单个学生信息')
            search_student()
        elif opt == '5':
            # print('5. 查询所有的学生信息')
            show_all_info()
        elif opt == '6':
            print('欢迎下次使用本系统......')
            save()
            break
        else:
            print('输入有误,请再次输入')
            continue

        input('...... 回车键继续操作.......')


main()

你可能感兴趣的:(Python,python,mdb文件,字符串,算法,蓝桥杯)