Python中的文件及目录操作

Python中的文件及目录操作

在变量、序列和对象中存储的数据是暂时的,程序结束后就会丢失。为了能够长时间地保存程序中的数据,需要将程序中的数据保存到磁盘文件中。Python提供了内置的文件对象和对文件,以及目录进行操作的内置模块,通过这些技术可以很方便地将数据文件保存到文件中,以达到长时间保存数据的目的。
①掌握如何创建、打开和关闭文件
②掌握如何写入和读取文件的内容
③了解os和os.path模块
④掌握如何创建和删除目录
⑤掌握如何使用raise语句抛出异常

1、基本文件操作

在Python中,内置了文件对象,在使用文件对象时,首先需要通过内置的open()方法创建一个文件对象,然后通过该对象提供的方法进行一些基本文件操作,
1.1 创建和打开文件
在Python中,想要操作文件需要先创建或者打开指定的文件并创建文件对象,open函数的语法格式为:

file = open(filename[,mode[,buffering]])

其中,mode为可选参数,用于指定文件的打开模式;buffering也为可选参数,用于指定读写文件的缓冲模式,值0表示不缓存,值1表示缓存,如果大于1,则表示缓冲区的大小。
1.1 打开一个不存在的文件时先创建该文件
例如:创建并打开记录蚂蚁庄园动态的文件。

print("\n","="*10,"蚂蚁庄园动态","="*10)
file = open('message.txt','w')   # 创建或打开保存蚂蚁庄园动态信息的文件
print("\n 即将显示……\n")

(2)以二进制形式打开文件
使用open()函数不仅可以以文本的形式打开文本文件,而且可以以二进制形式打开非文本文件,

file = open('picture.png'.'rb')
print(file)

(3)打开文件时指定编码方式
在使用open()函数打开文件时,默认采用GBK编码,当被打开的文件不是GBK编码时,将抛出异常,可以通过添加encoding='utf-8’参数即可实现将编码指定为UTF-8。

1.2 关闭文件
打开文件后,需要及时关闭,以免对文件造成不必要的破坏,关闭文件可以使用文件对象的close()方法实现,语法格式为:

file.close()

1.3 打开文件时使用with语句
打开文件后,需要及时关闭,在使用with语句的时候,无论是否抛出错误,都能够保证with语句执行完毕后关闭已经打开的文件,语法格式为:

with expression as target
	with-boby

其中,expression用于指定一个表达式;target用于指定一个变量;with-boby用于指定with语句体。
1.4 写入文件内容
在Python中,提供了with()方法,可以向文件中写入内容,write()方法的语法格式如下,

file.write(string)

例如:向蚂蚁庄园的动态栏目中写入一条信息。

print("\n","="*10,"蚂蚁庄园动态","="*10)
file = open('message.txt','w')   # 创建或打开保存蚂蚁庄园动态信息的文件
# 写入一条动态信息
file.write("你使用了1张加速卡,小鸡撸起袖子开始双手吃饲料,进食速度大大加快。\n")
print("\n 写入了一条动态……\n")
file.close()    # 关闭文件对象

在这里插入图片描述
1.5 读取文件
在Python中打开文件后,除了可以向其写入或追加内容,还可以读取文件中的内容,读取文件内容主要分为以下几种情况,
1.5.1 读取指定字符
文件对象提供了read()方法读取指定个数的字符,其语法格式为:

file.read([size])

其中,file为打开的文件对象;size为可选参数,用于指定要读取的字符个数,如果省略则一次性读取所有内容。
例如,要读取message.txt文件中的前9个字符,可以使用下面的代码。

扫描二维码关注公众号,回复: 15444276 查看本文章
with open('message.txt','r') as file:  #打开文件
		string = file.read(9)          #读取前9个字符
		pring(string)

使用read(size)方法读取文件时,是从文件的开头读取的,如果想要读取部分内容,可以先使用文件对象的seek()方法将文件指针移动到新的位置,然后再应用read(size)方法读取。seek()方法的基本语法格式为:

file.seek(offset[,whence])

其中,file表示已经打开的文件对象,offset表示用于指定移动的字符个数,其具体位置与whence有关,whence用于指定从什么位置开始计算,值为0表示从文件头开始计算,1表示从当前位置开始计算,2表示从文件尾开始计算,默认为0。
例如:显示蚂蚁庄园的动态。

print("\n","="*25,"蚂蚁庄园动态","="*25,"\n")
with open('message.txt','r') as file:   # 打开保存蚂蚁庄园动态信息的文件
    message = file.read()    # 读取全部动态信息
    print(message)           # 输出动态信息
    print("\n","="*29,"over","="*29,"\n")

运行结果为:
在这里插入图片描述1.5.2 读取一行
在使用read()方法读取文件时,如果文件很大,一次读取全部内容到内存,容易造成内存不足,所以通常会采用逐行读取,文件对象提供了readline()方法用于每次读取一行数据,readline()方法的基本语法格式如下:

file.readline()

其中,file为打开的文件对象,同read()方法一样,打开文件时,也需要指定打开模式为r(只读)或者r+(读写)。
例如:逐行显示蚂蚁庄园的动态,

print("\n","="*35,"蚂蚁庄园动态","="*35,"\n")
with open('message.txt','r') as file:   # 打开保存蚂蚁庄园动态信息的文件
    number = 0   # 记录行号
    while True:
        number += 1
        line = file.readline()
        if line =='':
            break    # 跳出循环
        print(number,line,end= "\n")  # 输出一行内容
print("\n","="*39,"over","="*39,"\n")

运行结果如下:
在这里插入图片描述1.5.3 读取全部行
读取全部行的作用与调用read()方法时不指定size类似,只不过读取全部行时,返回的是一个字符串列表,每个元素为文件的一行内容。读取全部行,使用的是文件对象的readlines()方法,其语法格式为:

fle.readlines()

其中,file为打开的文件对象,同read()方法一样,打开文件时,也需要指定打开模式为r(只读)或者r+(读写),

2.目录操作

目录也称为文件夹,用于分层保存文件,通过目录可以分门别类地存放文件,我们也知道可以通过目录快速地找到想要的文件,在Python中,并没有提供直接操作目录的函数或者对象,而是需要使用内置的os和os.path模块实现。

2.1 os和os.path模块

在Python中,内置了os模块及其子模块os.path用于对目录或文件进行操作,在使用os模块或者os.path模块时,需要先应用import语句将其导入,然后才可以应用它们提供的函数或者变量。
os模块提供的与目录相关的函数

函数 说明
getcwd 返回当前的工作目录
listdir(path) 返回指定路径下的文件和目录信息
mkdir(path [,mode]) 创建目录
makedirs(path1/path2…[,mode]) 创建多级目录
rmdir(path) 删除目录
removedirs(path1/path2) 删除多级目录
chdir(path) 把path设置为当前工作目录
walk(top[,topdown[,onerror]]) 遍历目录数
2.2 路径

用于定位一个文件或者目录的字符串被称为一个路径,在程序开发的时候,通常会涉及两种路径,一种是相对路径,另一种是绝对路径。
2.2.1 相对路径
在学习相对路径之前,需要先了解什么是当前工作目录,当前工作目录是指当前文件所在的目录,在Python中,可以通过os模块提供的getcwd()函数获取当前工作目录,例如,语法格式为:

import os
print(os.getcwd())  #输出当前目录

相对路径就是依赖当前的工作目录,如果在当前工作目录下有一个名称为message.txt的文件,那么在打开这个文件时,就可以直接写上文件名,这时采用的就是相对路径。
2.2.2 绝对路径
绝对路径是指在使用文件时指定文件的实际路径,它不依赖于当前工作目录,在Python中,可以通过os.path模块提供的abspath()函数获取一个文件的绝对路径,abspath()函数的基本语法格式如下:

os.path.abspath(path)

其中,path为要获取绝对路径的相对路径,可以是文件,也可以是目录。
2.2.3 拼接路径
如果想要将两个或者两个路径拼接到一起组成一个新的路径,可以使用os.path模块提供的join()函数实现,join()函数基本语法格式如下:

os.path.join(path1[,path2[,...]])

其中,path1、path2用于代表要拼接的文件路径,这些路径间使用逗号进行分割,如果在要拼接的路径中没有一个绝对路径,那么最后拼接出来的将是一个相对路径。

2.3 判断目录是否存在

在Python中,有时需要判断给定的目录是否存在,这时可以使用os.path模块提供的exists()函数实现,exists()函数的基本语法格式如下:

os.path.exists(path)

其中,path为要判断的目录,可以采用绝对路径,也可以采用相对路径,

2.4 创建目录

在Python中,os模块提供了两个创建目录的函数,一个用于创建一级目录,另一个用于创建多级目录,
2.4.1 创建一级目录
创建一级目录是指一次只能创建一级目录,在Python中,可以使用os模块提供的mkdir()函数实现,通过该函数只能创建指定路径的最后一级目录,如果该目录的上一级不存在,则抛出异常,语法格式为:

os.mkdir(path,mode=0o77)

其中,path表示要创建的目录,可以使用绝对路径,也可以使用相对路径,mode表示用于指定数值模式,默认值为0777,。
2.4.2 创建多级目录
使用mkdir()函数只能创建一级目录,如果想创建多级,可以使用os模块的makedirs()函数,该函数用于采用递归的方式创建目录,makedirs()函数的基本语法格式如下:

os.makedirs(name,mode=0o77)

其中,name表示用于指定要创建的目录,可以使用绝对路径,也可以使用相对路径,mode表示用于指定数值模式,默认值为0777。

2.5 删除目录

删除目录可以使用os模块提供的rmdir()函数实现,通过rmdir()函数删除目录,只要当要删除的目录为空时才起作用,rmdir()函数的基本语法格式如下:

os.rmdir(path)

其中,path为要删除的目录,可以使用相对路径,也可以使用绝对路径,例如,要删除C盘中demo文件中的目录,可以使用的代码为。

import os
os.rmdir("C:\\demo\\mr")
2.6 遍历目录

遍历在古汉语中的意思是全部走遍,到处周游,在Python中,遍历的意思也和这差不多,就是对指定的目录下的全部目录(包括子目录)及文件运行一遍,在Python中,os模块的walk()函数用于实现遍历目录的功能,walk()函数的基本语法格式如下。

os.walk(top[,topdown][,onerror][,followlinks])

例如:遍历指定目录。

import os   # 导入os模块
path = "C:\\demo"       # 指定要遍历的根目录
print("【",path,"】 目录下包括的文件和目录:")
for root, dirs, files in os.walk(path, topdown=True):  # 遍历指定目录
    for name in dirs:            # 循环输出遍历到的子目录
        print("∏",os.path.join(root, name))
    for name in files:           # 循环输出遍历到的文件
        print("≌",os.path.join(root, name))

3.高级文件操作

在Python内置的os模块除了可以对目录进行操作,还可以对文件进行一些高级操作,例如:
3.1 删除文件
Python中没有内置删除文件的函数,但是在内置的os模块中提供了删除文件的函数remove(),该函数的基本语法格式如下:

os.remove(path)

其中,path为需要删除的文件路径,可以使用相对路径,也可以使用绝对路径,
3.2 重命名文件和目录
os模块提供了重命名文件和目录的函数rename(),如果指定的路径是文件,则重命名文件,如果指定的路径是目录,则重命名目录,基本语法格式为:

os.rename(src,dst)

3.3 获取文件基本信息
在计算机上创建文件后,该文件本身就会包含一些信息,例如,文件的最后一次访问的时间、最后一次访问的修改时间、文件大小等基本信息,都可以通过os模块的stat()函数可以获取到这些文件的基本信息,stat()函数的基本语法如下:

os.stat(path)

其中,path表示为要获取文件基本信息的文件路径,可以是相对路径,也可以是绝对路径。
例如:获取文本基本信息

import os   # 导入os模块
fileinfo = os.stat("mr.png") # 获取文件的基本信息
print("文件完整路径:", os.path.abspath("mr.png")) # 获取文件的完整数路径
# 输出文件的基本信息
print("索引号:",fileinfo.st_ino)
print("设备名:",fileinfo.st_dev)
print("文件大小:",fileinfo.st_size," 字节")
print("最后一次访问时间:",fileinfo.st_atime)
print("最后一次修改时间:",fileinfo.st_mtime)
print("最后一次状态变化时间:",fileinfo.st_ctime)

运行结果如下:
在这里插入图片描述
由于上面的结果显示的时间和字节数都是一长串的整数,这与平时见到的不一样,所以将对数值进行格式化,代码如下。

import os   # 导入os模块

def formatTime(longtime):
    '''格式化日期时间的函数
       longtime:要格式化的时间
    '''
    import time  # 导入时间模块
    return time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(longtime))
def formatByte(number):
    '''格式化日期时间的函数
       number:要格式化的字节数
    '''    
    for (scale,label) in [(1024*1024*1024,"GB"),(1024*1024,"MB"),(1024,"KB")]:
        if number>= scale:   # 如果文件大小大于等于1KB
            return "%.2f %s" %(number*1.0/scale,label)
        elif number == 1: # 如果文件大小为1字节
            return "1 字节"
        else:   # 处理小于1KB的情况
            byte = "%.2f" % (number or 0) 
    return (byte[:-3] if byte.endswith('.00') else byte)+" 字节"  # 去掉结尾的.00,并且加上单位“字节”


if __name__ == '__main__':
    fileinfo = os.stat("mr.png") # 获取文件的基本信息
    print("文件完整路径:", os.path.abspath("mr.png")) # 获取文件的完整数路径
    # 输出文件的基本信息
    print("索引号:",fileinfo.st_ino)
    print("设备名:",fileinfo.st_dev)
    print("文件大小:",formatByte(fileinfo.st_size))
    print("最后一次访问时间:",formatTime(fileinfo.st_atime))
    print("最后一次修改时间:",formatTime(fileinfo.st_mtime))
    print("最后一次状态变化时间:",formatTime(fileinfo.st_ctime))

运行结果如下:

在这里插入图片描述
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_43401243/article/details/95066042