基本文件操作
文件打开模式:默认rt
- b:二进制模式;类似Java的字节流
- t:文本模式;类似Java的字符流
- r:只读,文件不存在则抛异常
- w:只写,文件不存在则创建
- a:只追加写,文件不存在则创建
- x:创建一个新文件以进行写入
- +:读取和写入(如:r+、w+、a+、x+)
with管理上下文:会自动关闭文件,释放资源
"""with语法格式:
with EXPRESSION as TARGET:
SUITE
"""
# 打开多个文件时,用逗号分隔
with open('D:/file1.txt', 'r') as file1, open('D:/file2.txt', 'w') as file2:
pass # pass为空操作:执行该操作时,不会发生任何事情
基本操作:
# 基本操作
path = "D:\\file.txt"
path = r"D:\file.txt"
path = "D:/file.txt"
# 1. 打开文件,t模式指定encoding,b模式不指定encoding
file = open(path, mode='w+', encoding='utf-8')
# 2. 读写文件
file.write("12345\n678910中国")
# 3. 关闭文件,释放资源
file.close()
print(type(file)) # <class '_io.TextIOWrapper'>
# 读操作:
"""
file.read() # 读取n个字符,负或省略则读取到EOF
file.readline() # 读取一行字符,文件指针移动到下一行行首
file.readlines() # 读取多行,存储到列表返回
"""
# 文本文件读取示例:
with open(r"D:\file.txt", mode='rt', encoding='utf-8') as file:
for line in file: # 一次读取一行
print(line, end='')
print()
# 二进制文件读取示例:
with open(r"D:\file.txt", mode='rb') as file:
while True:
buffer = file.read(1024) # 一次读取1024字节
if len(buffer) == 0:
break
print(buffer)
# 写操作:t模式写时不需要编码,b模式写时需要编码
with open(r"D:\file.txt", mode='wt', encoding='utf-8') as file:
file.write('12\n34\n') # t模式
# file.write('1111\n222\n'.encode('utf-8')) # b模式
# writelines写一个列表
file.writelines(['56\n', '78\n']) # t模式
# file.writelines([bytes('333\n', encoding='utf-8'), '444\n'.encode('utf-8')]) # b模式
print(file.readable()) # 是否可读
print(file.writable()) # 是否可写
print(file.tell()) # 当前文件指针距离文件开头的位置
file.flush() # 将内存中的文件内容刷新到硬盘
print(file.closed) # 文件是否关闭
print(file.encoding) # 文件的编码;如果打开模式为b,则没有该属性
print(file.name) # 文件名
# seek修改文件指针位置
with open(r"D:\file.txt", mode='rt', encoding='utf-8') as file:
offset = 1 # 相对于whence进行偏移的
whence = 0 # 0-开头(offset应>=0,t/b模式);1-当前位置(offset可能<0,b模式);2末尾(offset通常<0,b模式)
position = file.seek(offset, whence) # 更改文件指针位置,返回新的位置
print(file.tell(), position) # 1 1
print(file.read(), end='')
os模块的文件操作
import os
###############################
# 使用os操作文件与文件夹
os.mkdir('D:\\dir') # 创建文件夹
os.makedirs('D:\\dir\\a\\b') # 递归创建文件夹
os.rmdir('D:\\dir\\a\\b') # 删除文件夹
os.removedirs("D:\\dir\\a") # 递归删除文件夹
# os.chdir('D:\\') # 切换当前目录
print(os.getcwd()) # 获取当前目录
print(os.listdir('.')) # 获取某一目录下文件/文件夹的名称列表
# os.rename('./src.py', './rename.py') # 重命名文件/文件夹
# os.remove(r'D:\\1.txt') # 删除文件
###############################
# os中的常用值
print(os.curdir) # 当前文件夹
print(os.pardir) # 上一层文件夹
print(os.sep) # 系统的路径间隔符
print(os.environ) # 系统环境变量
# os.system("dir") # 执行系统命令
###############################
# 使用os.path操作文件与文件夹
print(os.path.normpath(__file__ + "/../..")) # 标准化路径,消除双斜线等
print(os.path.dirname(__file__)) # 去掉路径名的最后一部分
print(os.path.basename(__file__)) # 返回路径名的最后一部分
print(os.path.abspath(__file__)) # 返回规范化的绝对路径
print(os.path.isfile(__file__)) # 是否为文件
print(os.path.isdir(r'./tests')) # 是否为文件夹
print(os.path.getsize(__file__)) # 获取文件大小
print(os.path.join('a', r'D:\test', 'b', "c")) # 连接多个路径,如果有根目录,则舍去根目录前面的
###############################
# 使用pathlib.Path操作路径,需要Python3.5+
import pathlib
print(pathlib.Path(__file__).parent) # 获取父路径
print(pathlib.Path(__file__) / 'a/b.txt') # 拼接路径
print(pathlib.Path(__file__).resolve()) # 标准化路径
shutil模块的文件操作
import shutil
src = ""
dst = ""
shutil.copy(src, dst) # 将src文件复制到dst
shutil.copytree(src, dst) # 复制整个文件夹
shutil.move(src, dst) # 移动文件/文件夹
fsrc = open(src, "r")
fdst = open(dst, "w")
shutil.copyfileobj(fsrc, fdst) # 将fsrc的内容覆盖拷贝到fdst
path = ""
shutil.rmtree(path) # 递归删除文件夹
base_name = "打包后的路径,不带后缀"
format = "打包格式,如:zip、tar、bztar、gztar等"
root_dir = "要打包的文件/目录"
shutil.make_archive(base_name, format, root_dir) # 压缩文件夹,返回压缩后的绝对路径
filename = "要解压的压缩包"
extract_dir = "解压到的文件夹,默认当前目录"
shutil.unpack_archive(filename, extract_dir) # 解压压缩包