文件操作
什么是文件?
文件就是数据持久化存储在磁盘上的一种形式,常见的文件如音频(mp3)、视频(mp4)、网页(html)、Python文件(py)、图片(png)、图片(jpg)、文本(txt)等等。
想一想,我们在电脑上面一般是如何操作文件的呢?
第一步:打开文件
第二步:编辑保存文件
第三步:关闭文件
用 Python 来操作文件流程大致与上列步骤一致。
打开文件
在 Python 中使用 open 函数打开文件,具体操作如下:
open(参数1,参数2)
open函数就是在本地打开一个文件
参数1 选择文件的路径
参数2 打开文件的方式
file = open('文件路径','文件的打开模式')
# 示例 :打开c盘下面的1.txt文件用于写入数据
file = open('c:/1.txt','w')
# 写入权限
file.write("我是世界上最美丽的人!")
# 关闭文件
file.close()
open 函数返回的结果可以用于对改文件进行后续的操作,比如写入数据,关闭文件等等。
文件的打开模式有以下类型:
关于文件路径
相对路径: 以当前操作的文件为起点,去寻找文件
./ 上一级目录
../ 上上一级目录
绝对路径: 以计算机盘符为起点
总结个规律:
-
带 r 的都需要操作文件必须存在;
-
带 b 的是用二进制方式处理;
-
带 + 号的都有读写权限;
-
r 是read 只读,文件必须在;
-
w 是white 只写,文件在就原文件重写,没有就新建;
-
a 是追加写内容,抓住重点随意组合;
随意组合中 1 凡是含有r这个文件都必须存在,如果不存在程序报错 2 凡是含有w,如果文件存在就覆盖原来的内容,文件不存在就创建新文件 文件操作的注意事项: 非纯文本都是用二进制的方式处理操作 json txt csv
文件类型
写入数据
文件写入使用
write 函数
# 使用相对路径打开文件,并赋予追加写入权限
file = open('file/1.txt','w+')
# 在文件1.txt中写入数据
file.wirte('亲爱的同志们,我爱你们!')
writelines函数
new_file = open("file/2.txt","w")
# 一次写一行
new_file.writelines("啦啦啦\n啦咔咔咔")
关闭文件
当结束文件操作后,需要执行关闭文件操作,以释放资源,使用 close( ) 函数,文件关闭后将不能继续对文件进行读写操作,如果需要读写操作,则需要重新打开文件。
# 使用相对路径打开文件,并赋予追加写入权限
file = open('file/1.txt','w+')
# 在文件1.txt中写入数据
file.wirte('亲爱的同志们,我爱你们!')
# 关闭文件,结束文件操作
file.close()
文件读取
存储单位
比特位
字节 0000 0000 8个比特位 --> 255 计算机底层二进制 99999999 11111111(二进制)
KB 1024个字节
MB 1024kb
GB
TB
PB
read函数
语法结构:
'''
file.read(参数) 用于读取文件
参数:count为缺省参数,不传为读取整个文件,若传递则为需要读取的长度,一次性读取文件的大小
返回值:读取到的内容
'''
read(count)
代码示例:
# 假设存在文件1.txt
file = open('1.txt','r')
# 读取整个文件
content = file.read()
# 读取文件 按照字节读完为止
content = file.read(1024)
# 关闭文件
file.close()
readline函数
'''
读取文件的一行数据
返回值:读取到的内容
'''
readline()
readlines函数
'''
读取文件所有行的内容
返回值:读取到的内容,返回的数据类型是列表,每一行数据都是列表中的一个元素
'''
readlines()
案例练习:文件复制
"""
思路:
第一步:获取到需要复制的文件路径
第二步:根据路径读取文件
第三步:创建一个新文件,写入我们读取到的内容,并存储在我们指定的文件夹里
"""
# 获取原文件路径
old_file_path = input("请输入您需要复制的文件路径:")
# 读取原文件
with open(old_file_path,"rb") as oldfile:
# 开始读取文件
content = oldfile.read()
"""
oldfile.readline()
一次读取一行内容,如果读取到内容,就返回读到的内容,如果没有读取到内容,就返回 -1
如果想读完,可以通过循环,如果读到的内容只要不等于 -1,就继续读取,如果等于-1 ,循环就结束
while oldfile.readline() != -1:
oldfile.readline()
"""
# 新文件名
# 找文件名后缀 . 点的下标,rfind是从右边查找 . 的下标
index = old_file_path.rfind(".")
# 通过字符串切片,提取文件路径+文件名+后缀
new_file_path = old_file_path[:index] + "[副本]" + old_file_path[index:]
# 创建新文件,写入数据
with open(new_file_path,"wb") as newfile:
newfile.write(content)
案例练习:文件批量重命名
代码示例:
"""
文件批量重命名
思路:
第一步:获取文件路径
第二步:获取该目录下所有的文件
第三步:执行重命名操作
注:如果该目录下的文件是同一种类型的文件时才可以使用 rename
"""
# 使用 rename 进行重命名
# 导入 os 模块
import os
# 获取文件路径
old_file_path = input("请输入文件路径:")
# 获取文件夹中,所有的文件,输出的是列表
file_list = os.listdir(old_file_path)
# 定义命名规则
flag = 4
# 依次取出每一个文件
for i in file_list: # i 取出的是每一个文件的文件名称 + 后缀,并不是完整的路径
# 拼接原文件完整路径
old_path = old_file_path + os.sep + i # os.sep 就是一个 \ 斜杠
path = old_file_path + os.sep
print(old_path)
# 如果这个文件夹内的文件类型不一致,就需要获取每一个文件的后缀
# 找文件名后缀 . 点的下标,rfind是从右边查找 . 的下标
index = old_path.rfind(".")
# 新文件路径(整个文件名称按命名规则修改)
new_file_path = path + "{}{}".format(flag,old_path[index:])
os.rename(old_path,new_file_path)
flag += 1
print(new_file_path)
with open as
通过上面的案例我们发现,每次打开一个文件结束操作的时候,必须要将这个文件关闭,相对来说比较繁琐,有时候还很容易忘记,我们可以使用with open as,这样操作文件的时候就可以不用手动关闭文件,程序在结束文件操作后会自动关闭文件。
"""
with open as 方法不需要手动关闭文件,当你的with open as这个语句块结束以后,
程序自动帮你关闭
flush 方法 : 刷新缓存
"""
with open("file/1.txt","r") as new_file:
content = new_file.read()
# 强制刷新缓存,保障数据全部写出,一般情况下,文件关闭后程序会自动刷新到磁盘中.
# 使用flush方法,在文件关闭之前,确保数据写出了.
new_file.flush()
print(content)
文件偏移(文件的定位读取)
seek 函数
'''
参数2表示从文件的哪个位置开始算,0表示从文件开头,1表示从当前位置,2表示从文件末尾
参数1表示从参数2的位置开始,往后偏移多少个字节
'''
seek(参数1,参数2)
参数1:偏移量
参数2:方向
0 从文件开头处理
1 表示从当前游标位置开始
2 表示从文件末尾开始
tell函数
'''
获取当前文件中的偏移量,可以记录游标的位置
可以使用tell获取文件总的bytes长度
'''
tell()
结合运用
# 打开文件
file = open("file/test.txt","r")
# 读取文件 读取一个字节
file.read(1)
file.seek(2,0) # 从开头开始算,偏移两个字节
num = file.tell() # 记录游标,返回游标的位置
file.seek(num,1) # 从游标的位置开始读取文件
file.close()
Python文件路径操作
os.path.abspath(path) #返回绝对路径
os.path.basename(path) #返回文件名
os.path.commonprefix(list) #返回多个路径中,所有path共有的最长的路径。
os.path.dirname(path) #返回文件路径
os.path.exists(path) #路径存在则返回True,路径损坏返回False
os.path.lexists #路径存在则返回True,路径损坏也返回True
os.path.expanduser(path) #把path中包含的"~"和"~user"转换成用户目录
os.path.expandvars(path) #根据环境变量的值替换path中包含的”$name”和”${name}”
os.path.getatime(path) #返回最后一次进入此path的时间。
os.path.getmtime(path) #返回在此path下最后一次修改的时间。
os.path.getctime(path) #返回path的大小
os.path.getsize(path) #返回文件大小,如果文件不存在就返回错误
os.path.isabs(path) #判断是否为绝对路径
os.path.isfile(path) #判断路径是否为文件
os.path.isdir(path) #判断路径是否为目录
os.path.islink(path) #判断路径是否为链接
os.path.ismount(path) #判断路径是否为挂载点()
os.path.join(path1[, path2[, ...]]) #把目录和文件名合成一个路径
os.path.normcase(path) #转换path的大小写和斜杠
os.path.normpath(path) #规范path字符串形式
os.path.realpath(path) #返回path的真实路径
os.path.relpath(path[, start]) #从start开始计算相对路径
os.path.samefile(path1, path2) #判断目录或文件是否相同
os.path.sameopenfile(fp1, fp2) #判断fp1和fp2是否指向同一文件
os.path.samestat(stat1, stat2) #判断stat tuple stat1和stat2是否指向同一个文件
os.path.split(path) #把路径分割成dirname和basename,返回一个元组
os.path.splitdrive(path) #一般用在windows下,返回驱动器名和路径组成的元组
os.path.splitext(path) #分割路径,返回路径名和文件扩展名的元组
os.path.splitunc(path) #把路径分割为加载点与文件
os.path.walk(path, visit, arg) #遍历path,进入每个目录都调用visit函数,visit函数必须有3个参数(arg, dirname, names),dirname表示当前目录的目录名,names代表当前目录下的所有文件名,args则为walk的第三个参数
os.path.supports_unicode_filenames #设置是否支持unicode路径名