学习文件操作的目的:让程序中的数据能够永久储存,因为文件是以硬件为载体
数据永久储存的方式
1.文件,适合储存少量数据,操作更加简单,性能没有数据库的读写性能高,适合少量数据储存
2.数据库。适合存储大量数据,操作成本会增加,优势:读写性能极高,速度会更快
3.1文件操作模式
1.r模式:以字符串方式读取文件中的数据
2.w模式:以字符串方式写入文件中的数据
3.a模式:以字符串方式往文件中追加写入数据
4.rb模式:以字节(二进制)的方式读取文件中的数据
5.wb模式:以字节(二进制)的方式写入文件中的数据
6.ab模式:以字节(二进制)的方式读取文件中追加写入数据
3.2r模式
r模式: 以字符串的方式读取文件中的数据
文件操作的步骤
1.打开文件指定文件的操作方式
file = open(“1.txt”,"r",encoding = "utf-8)
提示:在windows的python解释器下,打开的文件默认的是cp936,在mac和Linux的python解释器下,打开的文件默认的是utf-8
2.读取文件中的数据
content = file.read()
print(content)
3.关闭文件
file.close()
注意点:r模式打开文件时一定要保证文件存在
3.3w模式
w模式:以字符串的方式往文件中写入数据
打开指定文件的操作
file = open(‘2.txt‘,‘w‘,"endcoing = utf-8")
写入数据到文件
file.write("hello")
关闭文件
file.close()
注意点:
1.当文件不存在时,使用w模式会先创建一个孔得文件,然后再写入数据
2.当文件存在时,使用w模式时,会把文件中的内容清空,然后再写入新的数据
3.4a模式
a模式: 以字符串的方式往文件末尾追加写入数据
1.打开文件制定稳健的操作模式
file = open("3.txt","a","encoing = utf-8")
2.追加写入数据到文件
file.write("hi‘)
3.关闭文件
file.close()
注意点:
1.当使用a模式打开文件的时候,如果文件不存在,会先创建一个文件,然后在追加写入数据
2.当使用a模式打开文件时,如果文件存在,会在文件的末尾追加写入文件,之前的文件会保留。
3.5rb模式
学习rb模式的目的:
1. 想要借助网络把一个文件中的数据发生给另外一个程序的话,需要使用字节(二进制)的数据
2. 读取非文本文件,比如: 视频,图片,音频等文件需要使用rb模式读取数据
# 打开文件指定文件的操作模式
file = open("1.txt", "rb")
# 读取文件中的数据
data = file.read()
print(data, type(data))
# 把字节数据进行解码转成字符串数据
result = data.decode("utf-8")
print(result, type(result))
# 关闭文件
file.close()
# 提示: 如果文件的操作模式里面包含b模式,则不需要在打开文件的时候指定encoding参数
3.6wb模式
wb模式: 以字节(二进制)方式往文件中写入数据
学习wb模式的使用场景:比如网络中接收的输入想要写入到文件,可以使用wb模式msg = "hello python, 你好!"# 把字符串进行编码转成字节数据, 这里好比模拟是从网络中接收到的字节数据
data = msg.encode("utf-8")
print(data, type(data))
# 把字节数据保存到文件里面
file = open("2.txt", "wb")
# 写入字节数据到文件
file.write(data)
file.close()
3.7ab模式
ab模式: 以字节(二进制)方式往文件末尾追加写入数据
ab模式表示往文件中追加写入字节数据,之前的历史数据会保留
# 打开文件指定文件的操作模式
file = open("3.txt", "ab")
msg = "嘻嘻"
# 把字符串进行编码转成字节数据
data = msg.encode("utf-8")
# 追加写入数据
file.write(data)
# 关闭文件
file.close()
3.8读取数据的其他方式——read模式
read方法
1. 不定长参数,表示读取文件中的所有数据
2. 指定数据长度,读取指定长度的数据
2.1 如果文件的操作模式是r模式,read(5) 表示这一次最多读取5个字符串长度的数据
2.1 如果文件的操作模式是rb模式,read(5) 表示这一次最多读取5个字节长度的数据
# ============================r 模式读取指定长度的数据 ===================
# file = open("1.txt", "r", encoding="utf-8")
# while True:
# # 这里5表示最多读取5个字符串长度的数据
# data = file.read(5)
# if len(data) > 0:
# print(data)
# else:
# print("数据读取完毕!")
# break
# # data = file.read(3)
# # print(data)
# file.close()
# ============================rb 模式读取指定长度的数据 ===================
file = open("1.txt", "rb")
# 在utf-8编码格式化下,一个汉字占用3个字节,一个字母、数字、符号占用1个字节。
result = file.read(3)
print(result, type(result))
# 把字节数据解码成字符串
content = result.decode("utf-8")
print(content, type(content))
file.close()
3.9读取数据的其他方式——读取一行数据
readline方法: 表示读取一行数据,默认从第一行开始读取
file = open("3.txt", "r", encoding="utf-8")
while True:
# 读取一行数据
row_data = file.readline().strip() # 去重空白字符,包括(\n)
# "嘻嘻\n"
if len(row_data) > 0:
print(row_data)
else:
break
# print(type(row_data))
# 读取一行数据
# row_data = file.readline()
# print(row_data)
file.readline()
3.10读取数据的其他方式——读取所有行数据
readlines: 读取文件中的所有行数据
file = open("3.txt", "r", encoding="utf-8")
# 读取文件中的所有行数据
rows = file.readlines()
print(rows, type(rows))
new_list = [row.strip() for row in rows]
print(new_list)
# 遍历文件中的所有行数据
for row in new_list:
print(row)
# 获取最后两行数据,可以使用切片
result = new_list[-2:]
print(result)
file.close()
3.11文件的拷贝
# 原文件名
src_file_name = "test.txt"
# 1. 根据原文件的名字生成拷贝后的文件名
file_name, point, end_str = src_file_name.rpartition(".")
dst_file_name = file_name + "[复件]" + point + end_str
print(dst_file_name)
# 2. 打开原文件指定文件操作模式(rb)
src_file = open(src_file_name, "rb")
# 3. 读取原文件中的数据
src_file_data = src_file.read()
# 4. 打开目标文件指定文件的操作模式(wb)
dst_file = open(dst_file_name, "wb")
# 5. 把原文件读取到的数据写入到目标文件
dst_file.write(src_file_data)
# 关闭文件
src_file.close()
dst_file.close()
3.12文件和文件夹的相关操作
import os
# 创建空的文件, 123.txt
# file = open("123.txt", "w")
# file.close()
# 对文件进行重命名操作
# os.rename("123.txt", "666.txt")
# 对文件进行删除操作
# os.remove("666.txt")
# 创建文件夹
# os.mkdir("AAA")
# 创建文件到指定目录
# file = open("AAA/123.txt", "w")
# file.close()
# os.remove("AAA/123.txt")
# file = open("AAA/123.txt", "w")
# file.close()
# file = open("AAA/333.txt", "w")
# file.close()
# 获取当前操作文件夹的路径
path = os.getcwd()
print("当前操作文件夹的路径是:", path)
# 切换操作文件夹的路径
os.chdir("AAA")
# 获取当前操作文件夹的路径
path = os.getcwd()
print("当前操作文件夹的路径是:", path)
# 获取指定文件夹下的所有文件名
file_names = os.listdir() # 不指定路径,默认查看的是当前文件夹下的所有文件名
print(file_names)
# .. 表示上一级目录,. 表示当前目录
# result = os.listdir("..") # 获取指定文件夹下的所有文件名
# print(result)
# os.mkdir("BBB")
# 提示:只能删除空文件
# os.rmdir("BBB")
os.chdir("..")
# 获取当前操作文件夹的路径
path = os.getcwd()
print("当前操作文件夹的路径是:", path)
# 不能非空文件。
os.rmdir("AAA")
import shutil # 文件及文件夹操作的高级模块
import os
# 删除非空文件夹, 能够把文件夹及文件夹里面的所有文件全部删除
# shutil.rmtree("AAA")
# 判断文件是否存在
result = os.path.exists("1.txt")
print(result)
result = os.path.exists("111.txt")
print(result)
result = os.path.exists("BBB/345.txt")
print(result)
if os.path.exists("BBB/345.txt"):
print("文件存在,可以读取文件中的数据")
else:
print("文件不存在!")
3.13批量修改文件名
import os
# 1. 切换到AAA目录
os.chdir("AAA")
path = os.getcwd()
print(path)
# 2. 获取AAA目录里面的所有文件名
file_name_list = os.listdir()
print(file_name_list)
# 3. 遍历每一个文件名,对每一个文件完成重命名操作
for file_name in file_name_list:
# 生成重命名后的文件名
new_file_name = "彬哥出品-" + file_name
print(file_name, new_file_name)
# 对每一个文件完成重命名操作
os.rename(file_name, new_file_name)
原文:https://www.cnblogs.com/xin-dong-2020/p/13195341.html