简介
文件读写是很多应用程序的基本功能和重要组成部分。Python可以使文件管理极其简单,特别是和其它语言相对比。
语法 open('文件名','访问模式')
f = open(filename, mode)
f.close()
下面关于 open()
调用的解释:
- f 是 open() 返回的文件对象
- filename 是该文件的字符串名
- mode 是指明文件类型和操作的字符串
文件操作模式
模式 | 说明 |
---|---|
r(1) | 读模式(默认模式),用来读取文件内容。文件指针在文件的开头。文件需要事先存在,否则会产生FileNotFoundError异常。 |
w(1) | 写模式,用来向文件写入数据。文件指针在文件的开头。如果文件存在,则覆盖文件,否则会创建文件。 |
a(1) | 追加模式,用来向文件追加数据。文件指针在文件的末尾。如果文件存在,不会覆盖文件(追加写入),否则会创建文件。 |
x(1) | 写模式,用来向文件写入数据。文件指针在文件的开头。如果文件不存在,创建文件,否则产生错误。 |
t(2) | 文本(字符串)模式(默认模式),以文本形式操作文件。 |
b(2) | 二进制(字节)模式,以二进制形式操作文件。 |
+(3) | 读取或写入。 |
说明:在上表的(1)(2)(3)模式中,不同组的模式可同时使用,例如rt,wb+等。同一组的模式同时使用,例如rw,tb等。
区别:
- w+与r+区别:
- r+:可读可写,若文件不存在,报错。
- w+: 可读可写,若文件不存在,创建 。
- r+与a+区别:
- r+ 进行了覆盖写
- a+ 是文件末尾追加
文件操作常用方法属性
f.read()
- 读取文件的内容,调用 f.read(size), 这将读取一定数目的数据, 然后作为字符串或字节对象返回。
- size 是一个可选的数字类型的参数。 当 size 被忽略了或者为负, 那么该文件的所有内容都将被读取并且返回。
f = open('test.txt', 'r')
content = f.read()
f.close()
f.readline()
f.readline() 会从文件中读取单独的一行。换行符为 ‘\n’
f = open('test.txt', 'r', encoding='utf-8')
content_line = f.readline()
f.close()
f.readline() 遍历
# 方式一
f = open('test.txt', 'r', encoding='utf-8')
for line in f:
print(line) # 每次读取一行
f.close()
# 方式二
f = open('test.txt', 'r', encoding='utf-8')
while True:
line = f.readline()
if not line:
break
print(line)
f.close()
f.readlines()
f.readlines() 将返回该文件中包含的所有行。
f = open('test.txt', 'r', encoding='utf-8')
lines = f.readlines()
f.close()
f.seek()/f.tell()
如果要改变文件当前的位置, 可以使用 f.seek( offset: int, whence: int ) 函数。
- offset:偏移值
- whence: 0 表示开头, 如果是 1 表示当前位置, 2 表示文件的结尾
f = open('test.txt', 'r')
f.seek(6, 0)
offset = f.tell()
print(offset) # 6
content = f.read(1)
f.close()
使用with open打开文件
# 在with处打开的文件,可以保证,在with结束后一定能够得到有效的关闭。(无需我们显式调用close方法)
with open("backup.data", "w", encoding='utf-8') as f:
# 向文件写入数据。
f.write("我想写入点内容")
os 模块
os 模块提供了很多操作目录与文件的功能,主要对文件文件夹增删改查操作
import os
# 重命名
# src 源文件路径,dst 重命名后的文件路径
os.rename('file/text.txt', 'file/text.txt')
# 重命名所有路径
# old 原路径,new 新路径
os.renames('file/text.txt', 'fil2/text2.txt')
# 删除文件
# 如果path不是一个文件,或者文件不存在,将会产生FileNotFoundError异常
os.remove('file/text.txt')
# 新建文件夹
# 如果path所在父母了不存在,或者path目录已存在,都会产生FileNotFoundError或FileExistsError异常
os.mkdir('file/new_dir')
# 删除文件夹
# path必须是空目录,否则产生OSError异常
os.rmdir('file/new_dir')
# 创建多级目录
# 如果path所在的父目录不存在,则会连同父目录一同创建。
# 如果path目录已经存在,当exist_ok值为False,会产生FileExistsError异常,如果exist_ok值为True,则不会产生异常(默认值为False)
os.makedirs('file/new1/new2/new3', exist_ok=True)
# 删除多级目录
os.removedirs('file/new1/new2/new3')
# 获取当前目录
cur_dir = os.getcwd()
print(cur_dir)
# 改变目录
os.chdir('../')
cur_dir = os.getcwd()
print(cur_dir)
# 获取目录列表
dir_list = os.listdir('.')
print(dir_list)
# 执行脚本
os.system("print('hello python')")
path 模块
os 模块里面重要的子模块 path,主要是路径拼接切割
from os import path
# 切割文件或文件夹
# 返回一个元组,第一个元素是目录,第二个元素是文件名
file_tuple = path.split('file/text.txt')
# 切割文件 (文件名,后缀)
files = path.splitext('file')
# 判断是否是文件
isfile = path.isfile('text.txt')
# 判断是否是文件夹
isdir = path.isdir('text.txt')
# 判断文件或文件夹是否存在
isexists = path.exists('text.txt')
# 获取文件或文件夹大小
size = path.getsize('text.txt')
# 获取文件或文件夹绝对路径
abspath = path.abspath('file')
# 拼接字符串
str = path.join('hello', 'python')
# print(str) # hello\python
# 获取文件名
basename = path.basename('file/text.txt')
# print(basename) # text.txt
# 获取相对路径
dirname = path.dirname('file/new1/new2/newe3/text.txt')
# print(dirname) # file/new1/new2/newe3
pathlib
pathlib中的Path类可以创建path路径对象, 属于比os.path更高抽象级别的对象.
from pathlib import Path
# / 拼接路径
data_dir = Path('folder')
file_to_open = data_dir / 'data.txt'
# print(file_to_open) # folder\data.txt
filename = Path('file/text.txt')
# 获取文件名
name = filename.name
# 获取文件名后缀
suffix = filename.suffix
# 获取文件名(无后缀)
stem = filename.stem
# 判断文件或文件夹是否存在
exists = filename.exists()
shutil模块
shutil模块提供了高级操作文件的方式。我们可以通过该模块提供的功能,快捷方便的对文件或目录执行复制、移动等操作。
import shutil
import os
# 文件复制
root_path = os.getcwd()
root_path = root_path.replace('\\', '/')
src_path = root_path + '/src/src.txt'
dst_path = root_path + '/dst/dst.txt'
# 复制文件
shutil.c(src_path, dst_path)
# 复制文件
shutil.copyfile('file/work.py', 'file/work2.py')
# 复制文件
file1 = open('file/work.py', 'r', encoding='utf-8')
file2 = open('file/work2.py', 'w', encoding='utf-8')
shutil.copyfileobj(file1, file2)
# 复制多级目录文件(递归复制)
shutil.copytree('D:/PythonProject/PyProject2/src', 'D:/PythonProject/PyProject2/dst')
# 删除多级目录文件
shutil.rmtree('D:/PythonProject/PyProject2/dst')
# 移动多级文件或目录
shutil.move('D:/PythonProject/PyProject2/src', 'D:/PythonProject/PyProject2/dst')
案例
文件异常处理
try:
file = open('text.txt', 'r', encoding='utf-8')
100 / 0
print(file.read())
except:
print('发生异常')
finally:
if file != None:
file.close();
print('资源回收')
输出信息
发生异常
资源回收
文件遍历
file = open('text.txt', 'r+', encoding='utf-8')
for f in file:
print(f.strip())
file.close()
大文件复制
def copy_large_file():
old_file = open('video/视频.wmv', 'rb')
old_file_name = old_file.name
position = old_file_name.rfind('.')
pre = old_file_name[:position]
sux = old_file_name[position:]
new_file_name = pre + '[复制]' + sux
new_file = open(new_file_name, 'wb')
while True:
content = old_file.read(1024)
if len(content) == 0: break
new_file.write(content)
old_file.close()
new_file.close()
文件批量重命名
def rename_files():
os.chdir('file')
file_list = os.listdir()
for file_name in file_list:
if os.path.isfile(file_name):
position = file_name.rfind('.')
pre = file_name[:position]
sux = file_name[position:]
os.rename(file_name, pre + '[重命名]' + sux)