一、文件操作
1、文件的简单读写操作
"""
写文件的操作:
1.打开文件
2.写入内容
3.关闭文件
打开文件的方法:open(fileName, operation)
fileName:要操作的文件名(字符串)
operation:要执行的操作,w代表写,r代表读(字符串)
该方法返回一个文件对象
"""
# 1. 打开helloworld.txt文件,并且要执行write操作
f = open("helloworld.txt","w")
# 2. 文件对象调用write()方法向文件中写入字符串
f.write("hello world!!! this is python")
# 3. 关闭文件,否则程序不结束内容无法写到文件中
f.close() # close()方法将缓冲区的数据写入磁盘,并清空缓冲区
"""
读文件的操作:
1.打开文件
2.读取内容
read(num) : 读取指定字节数的文件内容,空参则读取所有文件内容
readline : 读取一行数据
3.关闭文件
"""
# 1.打开文件,设置操作为 r
f = open("helloworld.txt", "r")
# 2.读取文件内容,read(num),该方法如果传参,则表示读取多少个字符,如果不传参数,默认读取所有数据
text1 = f.readline()
text2 = f.read()
print(text1)
print(text2)
# 3.关闭文件
f.close()
2、文件的编码问题
"""
文件的编码问题:
问题引出:在项目下创建一个"笔记.txt"文件,在文件中存入中文
使用open最简单的方法打开文件,读取文件内容
此时,会报错如下:
Traceback (most recent call last):
File "D:/Python/Python-workspace/Day07/文件操作.py", line 11, in <module>
text = f.read();
UnicodeDecodeError: 'gbk' codec can't decode byte 0xa4 in position 16: illegal multibyte sequence
"""
# 1.代开文件
f = open("笔记.txt", "r")
# 2.读取文件内容
print(f.encoding) # cp936 该行可以输出当前文件内容的编码格式
# text = f.read(); # 不修改编码,该行会报错
# 3.关闭文件
f.close()
"""
解决编码问题:
在打开文件的时候,设定文件的编码格式
open(fileName, operation, encoding="编码集")
"""
# 1.打开文件
f = open("笔记.txt", "r", encoding="UTF-8") # encoding="UTF-8"代表以utf-8的编码格式打开文件,同时将内容转码为uft-8格式
# 2.读取文件内容
print(f.encoding) # UTF-8 该行可以输出当前文件内容的编码格式
text = f.read();
print(text)
# 3.关闭文件
f.close()
3、文件的权限
"""
文件操作的权限:
文件操作权限主要有:读数据(read)、写数据(write)、追加数据(append)
r:读取文件:如果文件存在,则可以读取文件,如果文件不存在,则直接报错
如果权限只有 r 的时候,是只能读,不能写。
r : 文件的操作权限是只读 ⭐⭐⭐⭐⭐
r+ : 文件的操作权限是可读可写 ⭐⭐⭐⭐⭐
rb : 按照只读的模式打开二进制文件,例如音频、视频、图片等(b就是binary,二进制的意思)
rb+ : 按照可读可写的方式打开二进制数据
w:写入文件:如果文件存在,可以写入数据(但是会将之前文件的内容清空),如果文件不存在,会先创建文件,然后再写入数据
如果权限只有 w 的时候,是只能写,不能读。
w : 文件的操作权限是只写 ⭐⭐⭐⭐⭐
w+ : 文件的操作权限是可读可写 ⭐⭐⭐⭐⭐
wb : 按照只写的模式打开二进制文件,例如音频、视频、图片等(b就是binary,二进制的意思)
wb+ : 按照可读可写的方式打开二进制数据
a:追加数据:如果文件存在,则在文件末尾追加数据,如果文件不存在,则创建文件,然后写入数据
a : 文件的操作权限是只能追加 ⭐⭐⭐⭐⭐
a+ : 可读可写的追加文本数据
ab : 按照只写的模式追加二进制文件,例如音频、视频、图片等(b就是binary,二进制的意思)
ab+ : 按照可读可写的方式追加二进制数据
"""
# 1.写入文件
f = open("test.txt", "w", encoding="utf-8")
f.write("这是我的第一个python读写工程测试!!!!")
f.close()
# 2.读取文件内容
f = open("test.txt", "r", encoding="utf-8")
text = f.read()
print(text) # 这是我的第一个python读写工程测试!!!!
f.close()
# 3.追加数据
f = open("test.txt", "a", encoding="utf-8")
f.write("我在test.txt下面追加数据。")
f.close()
# 4.读取追加过后的数据
f = open("test.txt", "r", encoding="utf-8")
text = f.read()
print(text) # 这是我的第一个python读写工程测试!!!!我在test.txt下面追加数据。
4、文件的指针控制
"""
文件指针:就相当于光标,即,指向当前文件操作开始的位置
对文件进行任何的读写操作,都会修改文件指针的位置
r 和 w 模式打开文件,指针都在文件的起始位置
a 模式打开文件,指针默认在文件末尾
tell() : 文件对象调用该方法,返回的是当前文件指针的读写位置,值是当前位置距离文件开头的字节数。
seek(offset, whence) : 文件对象调用该方法,可以设置操作文件对象时的指针位置
offset : 偏移量,即距离whence指定的位置的字节数 +数代表向右,-数代表向左
whence : 设置偏移量的起始位置,取值有(0,1,2) 0:代表文件开头;1:代表当前文件指针的位置;2:代表文件结尾
"""
f = open("笔记.txt", "r+", encoding="UTF-8")
print(f.tell()) # 0 此时文件光标在开头位置,因此返回值为 0
print(f.readline()) # 这里面有很多的中文
# python中每个中文占3个字节,readline()方法一共读到9个汉字,然后指针指向下一行,多了一个换行符\r\n,换行符占用2个字节,所以结果是 29
print(f.tell()) # 29
f.seek(0)
print(f.tell()) # 使用seek()方法将指针重新指向文件开头,所以结果为 0
f.seek(5, 0) # offset 为5, whence为0,表示从文件开头,向右移动5个字节,所以此时指针指向的位置是 5
print(f.tell()) # 5
f.close()
5、文件的读写函数
"""
文件的读写函数:
"""
# 1.写的操作 write(str) :接收字符串参数,并从指针位置开始,向后覆盖内容
f = open("笔记.txt", "r+", encoding="utf-8")
f.write("\nnihaoshijie\n") # \n代表换行
f.close()
# 2.读的操作:
# read(num) :从文件指针位置开始,读取指定的字节数的内容,如果空参,则默认读取全部内容,并返回字符串
# readline(num) : 从文件指针位置开始,向后读取一行内容,并返回字符串,readline()读完当前一行,默认将指针指向下一行开始。
# 带参数是读取一行中指定的字节数的内容,如果字节数超出内容数,则忽略参数
# readlines() : 读取文件内容,返回一个列表,列表的每个元素都是文件每行的内容
f = open("笔记.txt", "r+", encoding="utf-8")
f.read(10)
f.readline(1000)
f.readlines()
f.close()
6、文件缓冲区的处理
"""
文件缓冲区的处理
f.write() : 将字符串写到缓冲区
f.close() : 将缓冲区的内容写入文件,并且将缓冲区清空,同时关闭文件
f.flush() : 将缓冲区的内容写入文件,但是不清空缓冲区内容
f.read() : 将内容读取到缓冲区
time.sleep(10) : 文件对象暂停10秒再进行之后的操作
"""
import time
# ------------------------------------------------------------------------------
f = open("缓冲区处理.txt", "w+", encoding="utf-8")
f.write("python中缓冲区的处理")
f.close() # 调用close方法,文件缓冲区清空,内容写到文件中,关闭文件
# ------------------------------------------------------------------------------
f2 = open("缓冲区处理.txt", "w+", encoding="utf-8")
f2.write("第二次操作缓冲区处理.txt文件,之后我要进行flush操作,然后再写一句话\n")
f2.flush() # 执行完flush操作去查看文件,文件内容已经写入,此时缓冲区还是有内容
time.sleep(1) # 让程序暂停十秒,以便去查看flush操作之后文件内容是否已经写入
f2.write("第一次查看文件时,没有这句话,close操作之后才有")
f2.close()
# ------------------------------------------------------------------------------
f3 = open("缓冲区处理.txt", "w+", encoding="utf-8")
f3.write("helloworld!!!")
f3.write("helloworld!!!")
f3.write("helloworld!!!")
f3.write("helloworld!!!") # 写操作写完之后,指针位置在文件末尾
f3.flush() # 将内容写入文件
f3.seek(0)
# read操作是从指针开始位置读取文件内容,如果没有将指针重新指向文件开头,则读取不到文件内容。有没有f3.seek(0),演示效果不一样
print(f3.read())
f3.close()
7、文件的信息处理
"""
文件的信息处理
"""
f = open("笔记.txt", "r", encoding="utf-8")
# 查看文件编码
print(f.encoding)
# 查看文件名
print(f.name)
# 查看文件是否关闭,如果文件已经关闭,返回True,否则返回False
print(f.closed)
# 查看文件的读写权限
print(f.mode)
8、文件目录的操作处理
"""
文件的路径:
绝对路径:从磁盘根目录开始,到指定的文件的完整路径
相对路径:相对于某个目录位置的路径,..表示上一级目录,.表示当前目录
"""
"""
文件操作
"""
import os
f = open("笔记.txt", "r", encoding="utf-8")
# ⭐⭐⭐⭐⭐1.获取当前的文件所在文件夹的绝对路径
filePath = os.getcwd()
print(filePath) # D:\Python\Python-workspace\Day07
# ⭐⭐⭐⭐⭐2.判断相对于当前文件所在的文件夹中是否存在某个指定的文件,返回的是布尔值
isHave = os.path.exists("文件操作.py") # 参数也可以是带路径的文件名,表示从当前路径出发的相对路径
print(isHave) # True
# 如果文件名是带路径的,可能会遇到转义字符,如:\r \n等,在字符串最前面加上 r 即可表示对后面的带\的地方不做转义
print(os.path.exists(r"H:\360补丁\test\filelist.dat"))
# ⭐⭐⭐⭐⭐3.删除指定路径的文件
#os.remove("duxie.py") # 删除当前路径下的文件
#os.remove(r"H:\360补丁\test\filelist.dat") # 删除指定路径下的文件
# os.remove(r"..\Day06\a.txt") # 删除当前路径上一级目录下的文件
# ⭐⭐⭐⭐⭐4.给指定文件重命名:os.rename(oldName, newName)
# os.rename("test.txt", "text.txt")
# ------------------------------------------------------------------------------------------------------
"""
目录操作
"""
# 1. os.listdir(filePath) : 获取指定目录下的所有文件,返回一个列表,空参方法表示返回当前目录下的所有文件
fileList = os.listdir();
print(fileList) # ['.idea', 'a.txt', 'duxie.txt', 'helloworld.txt', 'text.txt', '文件操作.py', '笔记.txt', '缓冲区处理.txt']
if "a.txt" in os.listdir():
f = open("a.txt", "r", encoding="utf-8")
print(f.read())
f.close()
# ⭐⭐⭐⭐⭐2. os.mkdir(filePath) : 在指定目录下创建目录(文件夹),该方法一次只能创建一个目录,不能创建多级目录
os.mkdir(r"D:\test")
# 3. 创建多级目录使用 : os.makedirs(filePath)
os.makedirs(r"D:\ttext\aa\bb")
# 4. 删除指定目录 : os.rmdir(filePath),一次只能删除一个,并且只能是空目录
os.rmdir(r"D:\ttext\aa\bb")
# 5. 删除多级目录 : os.removedirs(filePath)
#os.removedirs(r"D:\ttext")
二、作业
1、备份任意格式的文件
"""
创建任意文件的备份文件
"""
import os
# 1.获取当前路径下的所有文件列表
filePath = os.getcwd() # 获取当前文件所在的目录的绝对位置
print(filePath)
fileList = os.listdir(filePath) # 获取当前文件所在目录的文件列表
print(fileList)
# 2.输入要进行备份的文件名称
fileName = input("请输入要备份的文件名称(带后缀名):")
if fileName in fileList:
# 要备份的文件在文件列表中存在,创建备份的文件名
index = fileName.rfind(".") # rfind(str) : 该方法用于从后向前寻找某个字符第一次出现的位置
bakFileName = fileName[:index] + "_bak" + fileName[index:]
# 3.开始进行备份
# 打开原始文件和备份文件
srcFile = open(fileName, "r")
desFile = open(bakFileName, "w")
# 如果使用read()的空参方法,如果文件内容过大,容易造成内存溢出
# 如果使用readline()方法,如果文件内容过大且全在一行中,也容易造成内容溢出
# 使用read(num) 方法,每次读取1M数据
while True:
line = srcFile.read(1024 * 1024)
if len(line) != 0:
desFile.write(line)
desFile.flush()
else:
print("文件已经备份完毕!!!")
break
desFile.close()
srcFile.close()
else:
print("要备份的文件不存在!!!")
2、名片管理系统(将数据序列化到磁盘)