文件操作
文件的目的就是把数据存起来(持久化), 而不必每次都重新生成.
1-文件的基本操作
- 打开文件
# w 写入模式 r 读取模式
f = open('123.txt', 'w')
- 关闭文件
# 新建一个文件,文件名为:123.txt
f = open('123.txt', 'w')
# 关闭这个文件
f.close()
- 自动关闭文件
with open("123.txt", "w") as f:
pass # 执行完缩进代码, 会自动关闭文件
- 访问模式
访问模式 说明
r 只用于读取, 默认模式。文件不存在,会报错。
w 只用于写入。文件存在则先清空内容, 文件不存在,创建新文件。
a 只用于写入。文件存在则追加内容, 文件不存在,创建新文件。
r+ 用于读写。文件不存在,会报错。
w+ 用于读写。文件存在则先清空内容, 文件不存在,创建新文件。
a+ 用于读写。文件存在则追加内容, 文件不存在,创建新文件。
rb 二进制格式的只读操作。
wb 二进制格式的只写操作。
ab 二进制格式的追加操作。
- with 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)
# open() 返回一个 可迭代的文件对象
with open('123.txt') as f:
try:
for line in f:
print(line)
finally:
f.close()
# 无论文件大小, 迭代器会一行一行读入,不会占满内存
for line in open(file_path, "r"):
print(line)
- 文件的相关操作
有些时候,需要对文件进行重命名、删除等一些操作,python的os模块中都有这些功能
- 文件重命名
- 删除文件
- 创建文件夹
- 获取当前目录
- 改变默认目录
- 获取目录列表
- 删除文件夹
import os
# 获取 桌面路径
os.path.join(os.path.expanduser('~'),"Desktop")
# 获取当前文件的绝对路径
os.path.dirname(__file__)
# 文件重命名 文件操作中都是对路径进行处理,不是对文件名进行处理
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")
文件高级操作
- 光标的偏移
# 文件读写都会导致文件定位移动(光标移动)
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)
- 删除非空文件夹
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)