内存中存放的数据在计算机关机后就会消失。要长久保存数据,就要使用硬盘、光盘、U 盘等设备。为了便于数据的管理和检索,引入了**“文件”**的概念。
一篇文章、一段视频、一个可执行程序,都可以被保存为一个文件,并赋予一个文件名。操作系统以文件为单位管理磁盘中的数据。一般来说,==文件可分为文本文件、视频文件、音频文件、图像文件、可执行文件等多种类别。
在Python,使用open函数,可以打开一个已经存在的文件,或者创建一个新文件,语法:open(name, mode)
文件路径:① 绝对路径 ② 相对路径
./文件名称
或者直接写文件名称
即可../
来访问上一级路径(如果是多级,也可以通过…/…/…/去一层一层向上访问文件夹名称/
来访问某个目录下的文件'''
文件操作三步走:① 打开文件 ② 读写文件 ③ 关闭文件
① 打开文件 => 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()
'''
乱码是如何产生的?把这个原因说清楚!
大多数编程语言都是老外开发的,对中文的支持并不好。最早美国搞出了一套编码格式 => 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()
'''
文件读取也要分为三步走:
① 打开文件 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()
'''
需求:用户输入当前目录下任意文件名,完成对该文件的备份功能(备份文件名为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()
import os
os.函数()
'''
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')
'''
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')
'''
Ctrl + 鼠标左键点击一下模块,可以打开模块底层代码
'''
import shutil
shutil.rmtree('static')