python文件和目录的操作
python中,变量、序列和对象中存储的数据是暂时的,程序结束后就会丢失,为了能够长时间地保存程序中的数据,需要将程序中的数据保存到磁盘文件中,python提供了内置的文件和对象和文件、目录进行操作的内置模块。通过这些技术可以很方便地将数据保存到文件中,以达到长时间保存的目的。通过读写文件的操作,我们可以实现数据持久化。在Python中可以通过open函数来获得文件对象,可以通过文件对象的read和write方法实现文件读写操作。
首先来看在python中对文件的操作:
打开和关闭文件:
有了文件系统,我们可以非常方便的通过文件来读写数据;在Python中要实现文件操作是非常简单的。我们可以使用Python内置的open函数来打开文件,在使用open函数时,我们可以通过函数的参数指定文件名、操作模式和字符编码等信息,接下来就可以对文件进行读写操作了。这里所说的操作模式是指要打开什么样的文件(字符文件或二进制文件)以及做什么样的操作(读、写或追加),具体如下:
创建和打开文件
model参数
r :以只读的方式打开文件,文件的指针将会放在文件的开头,为默认模式
rb :以二进制格式打开一个文件用于只读 ,文件指针会在文件的开头
r+ :打开一个文件用于读写,文件指针将会在文件的开头
rb+ :以二进制格式打开-个文件用于读写,文件指针会放在文件的开头
iw:打开个文件用于写入,如果该文件已存在则将会覆盖文件,如果不存在则创建新文件
wb :以二进制打开一个文件用于写入
wb+ :以二进制格式打开- 个文件用于读写,如果文件存在则覆盖 ,如果不存在则创建新文件
a:打开一个文件用于追加内容,如果文件已存在,文件指针会放在文件的结尾,如果不存在则创建新文件进行写入
ab :以二进制格式打开一个文件用于追加写入
a+ :打开一个文件用于读写,如果该文件已存在,文件指针会放在结尾,文件打开时会是追加模式,该文件不存在则创建新文件
ab+ : 以二进制格式打开一个文件用于追加。
1.打开一个文件,若要打开一个不存在的文件,需要指定mode的参数值为w,w+,a,a+,若存在该文件,后面加w,会创建新的文件,把原文件覆盖。打开文件时需要指定编码方式,在使用open()函数时,默认采用的是GBK编码,当打开的文件不是BGK编码时,将抛出异常。
File = open(‘status.txt’, ‘w’, encoding=‘utf-8’)
2.关闭文件:
File = open(‘status.txt’)
File.close()
print(File.closed) # 检查是否关闭成功:True为关闭成功,False为关闭失败
with语法:文件打开后,执行完成后自动关闭
with open(‘status1.txt’) as file:
pass # 此句执行完,文件自动关闭
print(file.closed) # 验证是否关闭
3.写入内容:
write方法,主要在文件里写入内容,写完,文件自动关闭
with open(‘status2.txt’,‘w’,encoding=‘utf-8’) as ff:
ff.write(‘我们班是T221,我们在学python’)
file = open(‘status.txt’, ‘a’,encoding=‘utf-8’)
file.write(‘hello,你好啊!’)
file.close()
如果要向文件中写入内容,可以在打开文件时使用w或者a作为操作模式,
前者会截断之前的文本内容写入新的内容,后者是在原来内容的尾部追加新的内容。
file = open(‘致橡树.txt’, ‘a’, encoding=‘utf-8’)
file.write(’\n标题:《致橡树》’)
file.write(’\n作者:舒婷’)
file.write(’\n时间:1977年3月’)
file.close()
也可以用循环语句写入内容
lines = [‘我们在上pyhton程序设计,python自动化测试’, ‘标题:《致橡树》’, ‘作者:舒婷’, ‘时间:1977年3月’]
file = open(‘致橡树2.txt’,‘w’,encoding=‘utf-8’)
for line in lines:
file.write(f’\n{line}’)
file.close()
4.读取内容:
with open(‘status2.txt’, ‘r+’,encoding=‘utf-8’) as ff:
string = ff.read(9) #从取文件的开始9个长度的内容
print(string)
读取文件中的某一行
with open(‘status2.txt’,‘r+’,encoding=‘utf-8’)as ff:
m = ff.readline(25)
print(m)
读取全部:
file = open(‘致橡树2.txt’,‘r’,encoding=‘utf-8’)
print(file.read())
除了使用文件对象的read方法读取文件之外,
还可以使用for-in循环逐行读取或者用readlines方法将文件按行读取到一个列表容器中
file = open(‘致橡树.txt’, ‘r+’, encoding=‘utf-8’)
print(file.read()) # 读取出内容
print(file.readlines()) # 读取出列表内容
file.close()
import time
file = open(‘致橡树.txt’, ‘r+’, encoding=‘utf-8’)
for line in file:
print(line, end=’’)
time.sleep(5)
file.close()
file = open(‘致橡树.txt’, ‘r+’, encoding=‘utf-8’)
lines = file.readlines()
print(lines) # 读取文件内容,读取出来为列表的形式
for line in lines:
print(line, end=’’)
time.sleep(0.5)
file.close()
4.用指针来读取文件内容:在utf-8编码格式中,三个字符为一个汉字。
seek,指针是按照字符的个数进行读取,不是字符串的长度,status2.txt中内容为:我们班是T221,我们在学python
with open(‘status2.txt’, ‘r+’,encoding=‘utf-8’) as ff:
ff.seek(12) # 从地四个字符后开始读取
string = ff.read(5) # 读取3个字符
print(string)
目录的操作:
1.目录的遍历
import os
tuples = os.walk(r’D:\demo4’)
for i in tuples:
print(i, ‘\n’)
path = ‘D:\demo4’
for root, dirs, files in os.walk(path, topdown=True):
for i in dirs:
print(‘a:’, os.path.join(root, i))
for j in files:
print(‘b:’, os.path.join(root, j))
import os # 导入操作系统的包
print(os.name) # nt表示Windows操作系统,posix表示linux操作系统
print(os.linesep) # 获取当前的电脑的换行符,看不到效果
print(os.sep) # 获取当前系统中的路径分隔符
print(os.getcwd()) # 获取当前的工作目录
print(os.listdir(r’D:/Python/AutoTest/T221’)) # 获取担当起路径下文件和目录信息,写入绝对路径
获取文件的绝对路径,默认是当前目录
print(os.path.abspath(r’python.txt’))
拼接路径,join函数不会判断路径是否存在
print(os.path.join(f’D:/Python/AutoTest/’, ‘文件操作/目录操作.py’)) # 只是拼接成一个新地址,不考虑地址的有效性
判断目录(路径)是否存在
print(os.path.exists(r’D:/Python/AutoTest/文件操作’))
判断文件是否存在
print(os.path.exists(r’D:/Python/AutoTest/T221/文件操作/目录操作.py’))
创建一级目录,只能创建一级,不能创建几层
os.mkdir(r’D:\demo4’)
在创建目录之前,需要判断目录是否存在
path = ‘D:\demo4’
if not os.path.exists(path):
os.mkdir(path)
print(‘创建成功’)
else:
print(‘该目录已经存在’)
创建多级目录
os.makedirs(r’D:\demo4\demo3\demo2\demo1’)
判断多层目录是否存在
lr=‘D:\demo5\demo3\demo2\demo1’
list1 = [‘D:\demo5’,‘D:\demo4\demo3’,‘D:\demo4\demo3\demo2’,‘D:\demo4\demo3\demo2\demo1’]
list2 = []
for i in range(4):
if not os.path.exists(list1[i]): # 判断目录是否存在
list2.append(list1[i])
if len(list2) == 4:
os.mkdir(list2[3]) # 执行多级目录的创建
print(list2)
删除目录(删除一个空目录)
os.rmdir(r’D:\demo4\demo3\demo2’) # 逐级删除,先删demo2
删除非空目录,rmtree()实现
import shutil
shutil.rmtree(‘D:\demo4\demo3’) # 也是逐级删除
删除文件
import os
os.remove(r’D:\demo4\demo3\234.txt’)
path = ‘D:\demo4\demo3\234.txt’
if os.path.exists(path):
os.remove(path)
print(‘删除结束’)
判断是否删除成功,删除成功,打印不出
print(os.path.exists(r’D:\demo4\demo3\234.txt’))
创建文件夹
os.mkdir(r’D:\nihao’)
with open(r’D:\nihao\11.txt’, ‘r’, encoding=‘utf-8’)as file:
file.write(‘你好啊,我们在学习pyhton程序设计,python程序设计很好玩’)
a = file.read()
print(a)
删除文件
os.remove(r’D:\nihao\11.txt’)
验证是否存在
print(os.path.exists(r’D:\nihao\11.txt’))
获得文件的详细信息
a = os.stat(r’D:\nihao\1234.txt’)