1文件基础操作
- 1.1什么是文件
文件的种类很多以下是一些举例
文件的目的就是把数据存起来(持久化), 而不必每次都重新生成.
1.2文件的打开与关闭
想一想:
如果想用word编写一份简历,应该有哪些流程呢?
打开word软件,新建一个word文件
写入个人简历信息
保存文件
关闭word软件
同样,在操作文件的整体过程与使用word编写一份简历的过程是很相似的
打开文件,或者新建立一个文件
读/写数据
关闭文件
- 1.2.1打开文件
在python,使用open函数,可以打开一个已经存在的文件,或者创建一个新文件
open(文件名,访问模式)
示例如下:
# w 写入模式 r 读取模式
f = open('123.txt', 'w')
- 1.2.2关闭文件
# 新建一个文件,文件名为:123.txt
f = open('123.txt', 'w')
# 关闭这个文件
f.close()
- 1.2.3自动关闭文件
with open("123.txt", "w") as f:
pass # 执行完缩进代码, 会自动关闭文件
访问模式 说明
r 只用于读取, 默认模式。文件不存在,会报错。
w 只用于写入。文件存在则先清空内容, 文件不存在,创建新文件。
a 只用于写入。文件存在则追加内容, 文件不存在,创建新文件。
r+ 用于读写。文件不存在,会报错。
w+ 用于读写。文件存在则先清空内容, 文件不存在,创建新文件。
a+ 用于读写。文件存在则追加内容, 文件不存在,创建新文件。
rb 二进制格式的只读操作。后续网络课程中具体讲解。
wb 二进制格式的只写操作。后续网络课程中具体讲解。
ab 二进制格式的追加操作。后续网络课程中具体讲解。
1.3with open() 基本操作
# read() 将所有的内容全部读取出来
with open('123.txt') as f:
content = f.read()
print(content)
# read(n) 指定读取的字符数
with open('123.txt') as f:
content = f.read(4)
print(content)
# readline() 每次读一行
with open('123.txt') as f:
while True:
content = f.readline() # hello\n python
if len(content) == 0:
break
print(content, end="") # print()会默认换行(会在结尾自动添加\n), 可以通过end参数手动设置结尾的内容
# readlines() 读取出所有内容 每行一个元素,返回列表
with open('123.txt') as f:
content = f.readlines()
print(content)
1.4文件的相关操作
有些时候,需要对文件进行重命名、删除等一些操作,python的os模块中都有这些功能
- 文件重命名
- 删除文件
- 创建文件夹
- 获取当前目录
- 改变默认目录
- 获取目录列表
- 删除文件夹
import os
# 文件重命名 文件操作中都是对路径进行处理,不是对文件名进行处理
os.rename("123.txt", "666.txt")
# 文件删除
os.remove("666.txt")
# 创建文件夹
os.mkdir("demo")
# 获取当前路径 默认为项目目录
print(os.getcwd())
# 修改当前路径
os.chdir("demo")
print(os.getcwd())
os.mkdir("demo2")
# 列出目录中的内容(子文件夹和文件)
print(os.listdir()) # 默认列出当前路径
# 删除空文件夹
os.rmdir("demo")
2文件高级操作
2.1文件的偏移
# 文件读写都会导致文件定位移动(光标移动)
with open("123.txt", 'w+') as f:
# 文件的tell方法可以查看当前定位
print(f.tell())
f.write("hello python")
# 可以使用文件的seek方法 修改文件定位
# 参数whence 0 表示移动光标到文件开头 1 表示当前位置不变 2 表示移动光标到文件末尾
# 参数offset 基于whence设置偏移 seek(2, 0) 先移动光标到文件开头,再向右移动两个位置
# offset只能对文件开头设置偏移 whence=1 或 2, offset只能是0
f.seek(0, 1)
print(f.tell())
f.seek(0, 0)
print(f.tell())
content = f.read()
print("内容为:%s" % content)
2.2 删除非空文件夹-递归实现
import os
def custem_rmdir(path):
"""
删除非空文件夹
:param path: 文件夹路径
:return: None
"""
# 判断是文件夹是否为空
if len(os.listdir(path)):
# 遍历其中的内容 将这些内容全部删除
for sub_name in os.listdir(path):
# print(sub_name)
# 判断是文件还是文件夹
sub_path = os.path.join(path, sub_name)
if os.path.isfile(sub_path): # 是文件就删除
os.remove(sub_path)
else: # 是文件夹, 就递归
custem_rmdir(sub_path)
os.rmdir(path)
if __name__ == '__main__':
path = 'test'
custem_rmdir(path)