零、文章目录
Python基础08-文件操作详解
1、文件操作概述
(1)文件是什么
-
内存中存放的数据在计算机关机后就会消失。要长久保存数据,就要使用硬盘、光盘、U 盘等设备。为了便于数据的管理和检索,引入了**“文件”**的概念。
-
一篇文章、一段视频、一个可执行程序,都可以被保存为一个文件,并赋予一个文件名。操作系统以文件为单位管理磁盘中的数据。一般来说,==文件可分为文本文件、视频文件、音频文件、图像文件、可执行文件等多种类别。
(2)文件有哪些操作
- 在日常生活中,文件操作主要包括打开、关闭、读、写、备份等操作。
(3)文件操作的作用
- 文件操作的作用就是把一些内容(数据)存储存放起来,可以让程序下一次执行的时候直接使用,而不必重新制作一份,省时省力。
- 简单来说就是实现数据的持久化保存!
2、文件的基本操作
(1)文件的操作步骤
- ① 打开文件
- ② 读写文件
- ③ 关闭文件
(2)open()打开函数
-
在Python,使用open函数,可以打开一个已经存在的文件,或者创建一个新文件,语法:open(name, mode)
- name:是要打开的目标文件名的字符串(可以包含文件所在的具体路径)。
- mode:设置打开文件的模式(访问模式):只读、写入、追加等。
-
文件路径:① 绝对路径 ② 相对路径
- ① 绝对路径:绝对路径表示绝对概念,一般都是从盘符开始,然后一级一级向下查找(不能越级),直到找到我们要访问的文件即可。
- ② 相对路径:相对路径表示相对概念,不需要从盘符开始,首先需要找到一个参考点(就是Python文件本身)
- 同级关系:我们要访问的文件与Python代码处于同一个目录,平行关系,同级关系的访问可以使用
./文件名称
或者直接写文件名称
即可 - 上级关系:如果我们要访问的文件在当前Python代码的上一级目录,则我们可以通过
../
来访问上一级路径(如果是多级,也可以通过…/…/…/去一层一层向上访问 - 下级关系:如果我们要访问的文件在与Python代码同级的某个文件夹中,则我们可以通过
文件夹名称/
来访问某个目录下的文件
- 同级关系:我们要访问的文件与Python代码处于同一个目录,平行关系,同级关系的访问可以使用
(3)mode访问模式详解
(4)写操作快速入门
'''
文件操作三步走:① 打开文件 ② 读写文件 ③ 关闭文件
① 打开文件 => open(name, mode)
name = 代表要打开的文件路径 + 名称
mode代表访问模式,只需要记住三种模式即可 => r/w/a
r : read,只读模式,代表只能对文件进行读取,属于默认模式,如果要访问的文件不存在,则直接报错!
w : write,只写模式,代表只能对文件进行写入操作,如果访问的文件不存在,则系统会自动创建,但是写入文件时,
它首先要把文件内容清空,然后再写入新内容。
a : append,追加模式(只写模式的一种),与w类似,如果访问的文件不存在,也可以自动创建该文件。
但是在写入数据到文件时,其并不会清空文件的原有内容。
注意:open方法操作完成后,返回的是一个文件对象(对象的概念后面会学,也可以叫做文件句柄)
以后的读写都需要依赖这个对象(句柄)
② 写内容到文件 => f.write(content) => f.write()只能把字符串类型的数据写入到文件中
③ 关闭文件(为什么要关闭文件 => 因为文件打开以后需要占用计算机资源)
f.close()
'''
# 1、打开文件
f = open('python.txt', 'w')
# 2、写入内容到文件
f.write('Life is Short, I Study Python!')
# 3、关闭文件
f.close()
(4)解决写入中文乱码问题
- open的时候指定字符集encoding=‘utf-8’,可以让程序按照指定的字符集读写。
'''
乱码是如何产生的?把这个原因说清楚!
大多数编程语言都是老外开发的,对中文的支持并不好。最早美国搞出了一套编码格式 => ASCII => 1字节 => 8bit
0 0 0 0 0 0 0 0
1 1 1 1 1 1 1 1
2的8次方 => 主要能表达255个字符(主要包括了0-9,a-z,A-Z,老外字符)
随着编程语言和互联网发展,语言传入国内了,发现255个字符根本装不了汉字。所以就会产生所谓的乱码!
中国推出了自己的编码格式 => GB2312 => 比较广,传统255个字符 + 汉字支持 => GBK
中国台湾 => 喜欢使用繁体中文 => Big5
国际化组织受不了,每开一个系统,兼容所有语言 => 开发好几套系统 => 编码标准unicode => UTF-8
'''
# 1、打开文件
f = open('python.txt', 'w', encoding='utf-8')
# 2、写入内容到文件
f.write('人生苦短,我学Python!')
# 3、关闭文件
f.close()
(5)读操作相关方法
- read() : 读取文件的所有内容,可以添加一个参数size,代表读取字符长度,如果没有传入num,那么就表示读取文件中所有的数据。
- readlines() : 一次性读取文件的所有内容,返回结果是一个列表,列表中的每一个元素都是文件中的一行
- readline() : 一次读取文件的一行,读取一次向后移动一次,直到文件读取完毕,很少自己使用,通常要配合while
'''
文件读取也要分为三步走:
① 打开文件 f = open()
② 读取文件
③ 关闭文件 f.close()
在Python代码中,文件读取一共有3种方法:
read() : 读取文件的所有内容,可以添加一个参数size,代表读取字符长度
readlines() : 一次性读取文件的所有内容,返回结果是一个列表,列表中的每一个元素都是文件中的一行
readline() : 一次读取文件的一行,读取一次向后移动一次,直到文件读取完毕,很少自己使用,通常要配合while True
'''
# 1、第一种方法
# f = open('python.txt', 'r', encoding='utf-8')
# # content = f.read() # 读取文件所有内容
# content = f.read(1) # 代表只读取文件中的一个字符
# print(content)
# f.close()
# 2、第二种写法
# f = open('python.txt', 'r', encoding='utf-8')
# content = f.readlines()
# print(content)
# f.close()
# 3、第三种写法
f = open('python.txt', 'r', encoding='utf-8')
while True:
content = f.readline()
# 判断,如果读取不到任何内容,则结束循环
if not content:
break
# 反之,如果没有执行break,则代表文件中还有内容
print(content, end='')
print(content)
f.close()
(6)文件备份案例
- 需求:用户输入当前目录下任意文件名,完成对该文件的备份功能(备份文件名为xx[备份]后缀,例如:test[备份].txt)。
'''
需求:用户输入当前目录下任意文件名,完成对该文件的备份功能(备份文件名为xx[备份]后缀,例如:(test[备份].txt)。
① 命名变化:test.txt => 备份 => test[备份].txt
② 内容变化:需要把旧文件中的内容完全拷贝到新文件中
分析:命名变化如何实现
test.txt => test[备份].txt?
☆ 提示用户输入要备份的文件名称
☆ 分别获取文件的名称以及文件的后缀 => (文件名 => test 后缀 => .txt)
☆ 重新拼接新文件 test + [备份] + .txt
新方法:rfind()方法,从左向右查找,返回这个关键词在最后一次出现的位置
test.abc.txt
分析:文件内容变化
旧文件 => 读取操作
新文件 => 写入操作
把旧文件的内容全部读取出来写入到新文件中,但是文件如果比较大,考虑使用read或readline
'''
oldname = input('请输入您要备份的文件名称:')
# oldname = 'test.txt',拆解文件名与文件的后缀
index = oldname.rfind('.')
# 获取文件名称
filename = oldname[:index] # test
postfix = oldname[index:] # .txt
# 拼接新文件名称
newname = filename + '[备份]' + postfix
# 创建old_f文件句柄与new_f文件句柄
old_f = open(oldname, 'rb')
new_f = open(newname, 'wb')
while True:
content = old_f.read(1024) # r模式size代表字符长度,rb模式size代表字节大小 => 1KB
if not content:
break
new_f.write(content)
# 操作完成后,关闭文件
old_f.close()
new_f.close()
3、文件和文件夹操作
(1)os模块
- 在Python中文件和文件夹的操作要借助os模块里面的相关功能,具体步骤如下:
- ① 导入os模块
import os
- ② 还用os模块的相关功能
os.函数()
(2)与文件操作相关方法
- os.rename(旧文件名称,新文件名称):对文件进行重命名操作
- os.remove(要删除文件名称):对文件进行删除操作
'''
os.rename(旧文件名称, 新文件名称)
os.remove('要删除的文件名称')
案例:把Python项目目录下的python.txt文件,更名为linux.txt,查看效果后,对文件进行删除操作。
'''
# 1、导入os模块
import os
# 2、对python.txt重命名为linux.txt
if os.path.exists('python.txt'):
os.rename('python.txt', 'linux.txt')
# 3、把linux.txt移除
os.remove('linux.txt')
(3)与文件夹操作相关方法
- os.mkdir(新文件夹名称) :创建一个指定名称的文件夹
- os.getcwd() :current work directory,获取当前目录名称
- os.chdir(切换后目录名称) :change directory,切换目录
- os.listdir(目标目录) :获取指定目录下的文件信息,返回列表
- os.rmdir(目标目录) :用于删除一个指定名称的"空"文件夹
'''
import os模块
os.mkdir() 创建一个文件夹
os.getcwd() 获取当前程序工作目录
os.chdir() => change directory,切换目录
os.listdir() => list directory,以列表形式展现一个目录下的所有文件信息
os.rmdir() => remove directory,移除目录(删除文件夹,缺点:只能删除空文件夹)
案例:准备一个static文件夹以及file1.txt、file2.txt、file3.txt三个文件
① 在程序中,将当前目录切换到static文件夹
② 创建一个新images文件夹以及test文件夹
③ 获取目录下的所有文件
④ 移除test文件夹
'''
import os
# 1、我目前在什么位置
print(os.getcwd())
# 2、把当前工作目录切换到static文件夹
os.chdir('static')
# 3、创建images与test文件夹
if not os.path.exists('images'):
os.mkdir('images')
if not os.path.exists('test'):
os.mkdir('test')
# 4、获取一个目录下的所有文件
files = os.listdir()
print(files)
# 5、删除目录
if os.path.exists('test'):
os.rmdir('test')
(4)递归删除非空目录(慎重)
'''
Ctrl + 鼠标左键点击一下模块,可以打开模块底层代码
'''
import shutil
shutil.rmtree('static')