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