Python基础语法(二)、文件操作
文件操作
创建文件
在Python中创建文件主要是通过open关键字来实现的。
语法格式:
方法1:f=open('文件名','访问模式')
方法2:with open('文件名','访问模式') as f:(推荐使用,当执行完文件操作后会自动回收文件对象)
文件操作语句
示例:
f=open('text.txt','w+')#以读写方式创建一个text文件
print(type(f))#<class '_io.TextIOWrapper'>
文件访问模式:
模式 | 描述 |
---|---|
r | 以只读形式打开文件,文件指针在文件头部 |
r+ | 以读写形式打开一个文件,文件指针在文件头部 |
rb | 以二进制形式打开一个文件用于只读,文件指针在文件头部 |
rb+ | 以二进制形式打开一个文件用于读写,文件指针在文件头部 |
w | 以写入形式打开一个文件,如果文件也存在,新内容会覆盖,如果文件不存在则创建新文件 |
w+ | 以读写形式打开一个文件,如果文件也存在,新内容会覆盖,如果文件不存在则创建新文件 |
wb | 以二进制形式打开一个文件只用于写入,如果文件也存在,新内容会覆盖,如果文件不存在则创建新文件 |
wb+ | 以二进制形式打开一个文件用于读写,如果文件也存在,新内容会覆盖,如果文件不存在则创建新文件 |
a | 以追加形式打开一个文件,如果文件存在,文件指针放在文件末尾,新内容加在已有内容之后,如果文件不存在,则创建文件执行写入 |
a+ | 打开一个文件用于读写,如果文件存在,文件指针放在文件末尾,新内容加在已有内容之后,如果文件不存在,则创建文件执行写入 |
ab | 以二进制形式打开一个文件用于追加,如果文件存在,文件指针放在文件末尾,新内容加在已有内容之后,如果文件不存在,则创建文件执行写入 |
ab+ | 以二进制形式打开一个文件用于追加,如果文件存在,文件指针放在文件末尾,新内容加在已有内容之后,如果文件不存在,则创建文件执行写入 |
写入文件
文件写入是通过write方法来实现的,且访问模式不能是r和相关模式。
语法格式:
f.write("内容")
f.close()#操作完毕后一定要关闭!
示例:
f=open('text.txt','w+',encoding='utf-8')#写入中文时最好设置一下字符编码
f.write("你好!")#给text.txt文件写入“你好”
f.close()#对文件内容操作完后一点要记得关闭!
注意:
write()方法是不带回车的,要实现内容换行,可以自行添加\n
读取文件
文件读取有三个方法可以实现,分别是:read()、readline()、readlines(),可以给它们传递参数,参数是读取的字符数,读取的模式只能是r和r相关的模式。
语法格式:
1、f.read()
2、f.readline()
3、f.readlines()
示例:
f=open('text.txt','r',encoding='utf-8')
print("1",f.read())#读取到内容
print("2",f.readline())#空字符串,read()方法已经将内容读出,后面的就取不到内容了
print("3",f.readlines())#空列表
f.close()
#分开操作
f1=open('text.txt','r',encoding='utf-8')
f2=open('text.txt','r',encoding='utf-8')
f3=open('text.txt','r',encoding='utf-8')
print("1",f1.read())#读取全部内容,解析换行
print("2",f2.readline())#读取单行内容,解析换行
print("3",f3.readlines())#读取全部内容保存列表中,不解析换行,列表元素是每行的内容
f1.close()
f3.close()
f2.close()
删除文件
要操作文件本身,我们就要引入os模块,通过os.remove()可以实现删除文件的操作。
语法格式:
os.remove(fpath)
示例:
import os
fname=input("请输入文件名:")
if os.path.exists(fname):#路径合法性判断
os.remove(fname)#文件存在就删除文件
print("文件删除成功!")
else:
print("文件不存在!无法操作!")
重命名文件、文件夹
如果要实现文件、目录重命名的操作,要通过os.rename()来实现。
语法格式:
os.rename(oldname,newname)#可以放文件路径,也可以放文件夹路径
示例:
import os
oldname=input("请输入原文件名:")
if os.path.exists(oldname):#路径合法性判断
newname=input("请输入新文件名:")
os.rename(oldname,newname)#如果路径存在就执行重命名操作
print("文件重命名成功!")
else:
print("文件不存在!无法操作!")
复制文件
如果要复制文件就需要引入shutil模块,通过shutil.copy()来复制到任意路径。
语法格式:
shutil.copy(path,newpath)
示例:
import shutil,os
path=input("请输入目标文件路径:")
if os.path.exists(path):#路径合法性判断
newpath=input("请输入复制路径:")#如果带有文件名就是复制和重命名,没有文件名就是复制
try:
shutil.copy(path,newpath)#如果复制的文件和复制后的文件是同一个就会报错
print("复制完成!")
except shutil.SameFileError as e:#同命名文件异常处理
print("已存在同命名文件!")
else:
print("文件不存在!")
移动文件
要实现移动文件的操作就需要使用shutil.move()方法,它可以将文件从一个路径移到另一个路径。
语法格式:
shutil.move(path,newpath)
示例:
import shutil,os
path=input("请输入目标文件路径:")
if os.path.exists(path):
newpath=input("请输入移动路径:")
try:
shutil.move(path,newpath)
print("移动完成!")
except shutil.Error:#当文件已存在时的异常处理
print("文件已存在")
else:
print("文件不存在!")
文件指针移动
文件的读取不一定都是从开头起读,我们也可以为它设置一个出发位置,即移动文件指针,要移动文件指针就要通过seek(offset[,start])来实现,offset是移动字节数,start是参考位置,0为参考开头,1为参考当前。2位参考结尾。
语法格式:
f.seek(2)
示例:
f=open('text.txt','r+')
f.write("abcdefg")
f.seek(3)#移动三个字节
print(f.read(2))#从c开始读取两个字符:de
f.close()
目录操作
创建目录
如果要创建目录我们可以通过os.mkdir()来实现创建单个目录或者使用os.makedirs()来创建多级目录。
语法格式:
os.mkdir(path)#必须保证上一级目录是存在的,因为它只会建最后一个目录
os.makedirs(path)#可以用于创建多级目录
示例:
#1、mkdir方法创建单个目录
import os
path=input("请输入创建目录路径:")
index=path.rfind('/')
if os.path.exists(path[0:index]):#判断上一级目录是否存在
os.mkdir(path)#只创建最后一个目录
print("创建文件夹成功!")
else:
print("路径错误!")
#2、makedirs方法创建多级目录
import os
path=input("请输入创建目录路径:")
print(os.getcwd())
if not os.path.exists(path):#如果目录没有冲突就创建多级目录
os.makedirs(path)#创建多级目录
print("创建文件夹成功!")
else:
print("目录已存在!")
遍历目录
如果我们要查看目录下有什么文件,可以使用os.walk()和os.listdir()来遍历该目录,得出里面有什么文件。
语法格式:
flist1=os.walk(path)#flist1是一个生成器对象,可以遍历生成器查看数据
flist2=os.listdir(path)#flist2是一个列表,仅遍历当前目录的文件内容
示例:
#os.walk当前目录及子目录所有文件和文件
import os
for k in os.walk('../work'):
print(k)
#结果:
('../work', ['b', 'c'], ['t.txt', 'work1.py'])
#遍历所有目录,第一个元素为当前路径,子文件夹放在第一个列表,子文件放在第二个列表
('../work\\b', [], ['t3.txt'])
('../work\\c', ['d'], ['t.txt'])
('../work\\c\\d', ['e'], [])
('../work\\c\\d\\e', [], [])
#os.listdir(path)查看当前目录下的文件
import os
print(os.listdir("../work"))#仅返回当前目录下的文件
#结果:
['b', 'c', 't.txt', 'work1.py']
#os.listdir(path)递归遍历:
import os
fpath="..\work"
def func(fpath):
for i in os.listdir(fpath):
fpath1=os.path.join(fpath,i)#路径拼接
if os.path.isfile(fpath1):#判断是否为文件
print("文件:",fpath1)
else:
print("文件夹:",fpath1)
func(fpath1)
func(fpath)
复制目录
复制目录的操作,我们主要是通过shutil.copytree()来实现的。
语法格式:
shutil.copytree(dir,newpath)#newpath必须不存在
#copytree主要是复制文件夹的内容,可以在后面加原文件夹名字以满足复制
#文件夹要求,如shutil.copytree(r"..\work\b",r"..\work\d\b")
#它会在d中创建一个b文件夹,然后把b文件夹里复制的东西都放进去
示例:
import shutil
shutil.copytree(r"..\work\b",r"..\work\d\b")#将b文件下的内容复制到d创建的b文件中
移动目录
如果要移动目录也是通过shutil.move()来实现。
语法格式:
shutil.move(oldpath,newpath)
示例:
import shutil
shutil.move(r'..\work\b',r'..\work\c')#将b目录移动到c目录内
删除目录
删除目录的操作可以通过shutil.rmtree()和os.rmdir()来实现,os.rmdir()只能删除空目录,而shutil.rmtree()可以删除多级非空目录。
语法格式:
os.rmdir(dpath)
shutil.rmtree(dpath)
示例:
import shutil,os
os.rmdir("e/d/e")#删除目录e/d下面的e空文件夹
shutil.rmtree('e')#删除目录e下的所有文件和文件夹
常见文件操作相关函数:
函数 | 描述 |
---|---|
os.path.exists(path) | 判断路径是否存在,有就返回True,没有就返回False |
os.path.join(fpath,spath) | 目录拼接,将spath拼接到fpath后,spath不需要带斜杠 |
os.path.isfile(path) | 判断路径是否是文件,是就返回True,不是就返回False |
os.path.isdir(path) | 判断路径是否是文件夹,是就返回True,不是就返回False |