Python备份文件实现以及备份大文件出错解决方案

Python备份文件实现以及备份大文件出错解决方案


error: ‘gbk’ codec can’t decode byte 0xb2 in position 25: illegal multibyte sequence


前言:

博客内容:

  1、在使用python进行对文件的复制
  2、使用python备份大文件时报错 ‘gbk’ codec can’t decode byte 0xb2 in position 25: illegal multibyte sequence, 以及该错误解决方案.

python文件操作模式列表

不同模式打开文件的完全列表:

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

Tips:
  以r打开文件,一个汉字就是一个 read(4)就是读出四个汉字
  以 rb打开文件, 一个gbk汉字两个字节 read(4)就是两个汉字



一、使用python编写代码实现对指定文件的备份(小文件)

1、问题分析:

  所谓备份(backup), 本质就是把原来的文件复制一份, 再为其重新命名为备份文件名即可

2、代码实现:

# 利用脚本完成自动备份, 要求用户输入文件名称 ,完成自动备份
def copyFile():
    # 接收用户输入的文件名
    old_file = input('请输入要备份的文件名:')
    file_list = old_file.split('.') # 文件以 . 分隔
    # 构造新的文件名.加上备份的后缀
    new_file = file_list[0] + '_备份.' + file_list[1]
    old_f = open(old_file, 'r') # 打开需要备份的文件
    new_f = open(new_file, 'w') # 打开需要写数据的文件
    content = old_f.read()      # 将文件内容读取出来
    new_f.write(content)        # 将读取的内容写入备份文件
    old_f.close()
    new_f.close()
    pass

copyFile()

3、测试代码及结果展示

为了测试, 现在本项目文件夹下建立一个文本文档, 随便写点内容, 用来演示代码功能是否正常.

tips: input输入的文件名会默认在当前目录下寻找。
在这里插入图片描述

在pycharm中直接运行代码, 如果是在VSC写的代码, 可以安装一些对应插件, 右键在终端中运行代码(因为在vsc的输出窗口无法进行文本输入和编辑)

在这里插入图片描述


二、使用python编写代码实现对大文件备份以及报错处理(以备份视频文件为例 1.20G)

在这里插入图片描述

1、问题分析:

  如果处理超大文件, 一次将全部内容读取出来显然是不合适的,一次性读出会导致内存被占满.

  在备份小文件的代码基础之上改进下代码,让它备份大文件也不会导致内存被占满

  可以通过一块一块的把数据读取出来,然后在文件里面追加数据(a or a+)即可

2、代码实现:[这个代码是有问题的, 先看一下代码, 最后看报错问题以及解决方法]

def bakFile():
    old_file = input('请输入要备份的大文件名:')   # 手动输入要备份的文件
    file_list = old_file.split('.')             # 把原始文件以 . 分割开,即把文件名和文件后缀拆分
    new_file = file_list[0] + '_bak.' + file_list[1]    # 新的文件命名加上_bak
    try:
        with open(old_file, 'r') as old_f, open(new_file, 'w') as new_f:
            while True:
                content = old_f.read(1024)  # 每次读取1024个字节
                new_f.write(content)        # 给新建的备份文件写入这1024个字节
                if len(content) < 1024:     # < 1024说明已经读取到了这个文件的末尾了
                    break                   # break退出while循环
                pass
            pass
        pass
    except Exception as msg:
        print(msg)
        pass
    pass

bakFile()

在这里插入图片描述

tips: 备份出来的那个文件 [我和我的祖国_bak.mp4] 大小为0KB

3、错误原因:

  在视频, 压缩包, 音频这种比较大的文件备份时, 他们的内容编码格式比较复杂, 而python的r模式只是默认是gbk, 备份这种大文件,最好以二进制的方式读写, 也只能以二进制的方式读写才可以保证没问题。
  解决方案: 只需要把上面的代码中r和w改成rb和wb, 以二进制的方式去读写文件
def bakFile():
    old_file = input('请输入要备份的大文件名:')   # 手动输入要备份的文件
    file_list = old_file.split('.')             # 把原始文件以 . 分割开,即把文件名和文件后缀拆分
    new_file = file_list[0] + '_bak.' + file_list[1]    # 新的文件命名加上_bak
    try:
        with open(old_file, 'rb') as old_f, open(new_file, 'wb') as new_f: # 这里最好用rb wb, 要不然会出错 'gbk' codec can't decode byte 0xb2 in position 25: illegal multibyte sequence
            while True:
                content = old_f.read(1024)  # 每次读取1024个字节
                new_f.write(content)        # 给新建的备份文件写入这1024个字节
                if len(content) < 1024:     # < 1024说明已经读取到了这个文件的末尾了
                    break                   # break退出while循环
                pass
            pass
        pass
    except Exception as msg:
        print(msg)
        pass
    pass

bakFile()

4、结果展示

下面是文件夹中的,可以看到两个文件大小都是一样的,打开视频也是一样的, 证明代码可以使用。
在这里插入图片描述


小结:

文件读写的几种操作方式

  1、read(读): r r+ rb rb+

    (1).r r+ 只读 适用于普通的读取场景

    (2).rb rb+ 适用于文件 图片 视频 音频 这样的文件读取

  2、write(写):
    (1).w wb+ w+ 每次都会创建一个新的文件

    (2).二进制读写的时候 要注意编码问题 默认情况下写入文件的编码是gbk


一件事做到一定程度无法继续提升, 你要相信这并不是你的上限, 这只是你的一个瓶颈。要努力让所经历的这一切都值得, 加油!

Author : 李光辉
date : Sun Sep 13 15:43:09 CST 2020
blog ID: Kevin_8_Lee
blog site : https://blog.csdn.net/Kevin_8_Lee


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值