12、文件及目录操作
在变量、序列和对象中存储的数据是暂时的,程序结束后就会丢失。为了能够长时间地保存程序中的数据,需要将程序中的数据保存到磁盘文件中。Python提供了内置的文件对象和对文件,以及目录进行操作的内置模块。
12.1 基本文件操作
在Python中,内置了文件(File)对象。使用open()
函数打开文件,可以使用文件对象的write()
方法向文件中写入内容,以及使用close()
方法关闭文件等。
12.1.1 创建和打开文件
使用open()
函数打开文件,基本语法格式为:
file = open(filename[,mode,[,buffering]])
mode参数的参数说明:
1. 打开一个不存在的文件时先创建该文件
一般情况,用open()
一个不存在的文件,会报错。所以,在调用open()
函数时,指定mode
的参数值为w、w+、a、a+
。这样,当要打开的文件不存在时,就可以创建新的文件了。
print('\n','=' * 10, '蚂蚁庄园动态', '=' * 10)
file = open('message.txt', 'w')
print('\n 即将展示.....\n')
'''
========== 蚂蚁庄园动态 ==========
即将展示.....
'''
2. 以二进制形式打开文件
open()
函数不仅可以以文本的形式打开文本文件,而且可以以二进制形式打开非文本文件,如图片文件、音频文件、视频文件等。
f = open('bjut.jpg', 'rb')
print(f)
'''
<_io.BufferedReader name='bjut.jpg'>
'''
3.打开文件时指定编码方式
在使用open()函数打开文件时,默认采用GBK编码,否则就会被报错。在调用open()函数时,通过添加encoding='utf-8'
参数即可实现将编码指定为UTF-8。例如,打开采用UTF-8编码保存的notice.txt文件,可以使用下面的代码。
file = open('notive.txt', 'r', encoding = 'utf-8')
12.1.2 关闭文件
打开文件后,需要及时关闭,以免对文件造成不必要的破坏。关闭文件可以使用文件对象的close()
方法实现。
print('\n','=' * 10, '蚂蚁庄园动态', '=' * 10)
file = open('message.txt', 'w')
print('\n 即将展示.....\n')
file.close()
12.1.3 打开文件时使用with语句
如果打开文件时抛出了异常,将导致文件不能被及时关闭。则使用Python提供的with
语句。
print('\n','=' * 10, '蚂蚁庄园动态', '=' * 10)
with open('message.txt', 'w') as file: # 创建或者打开蚂蚁庄园动态信息的文件
pass # 不执行任何操作
print('\n 即将展示.....\n')
12.1.4 写入文件内容
Python的文件对象提供了write()
方法,可以向文件中写入内容。
print('\n','=' * 10, '蚂蚁庄园动态', '=' * 10)
file = open('message.txt', 'w')
file.write('你使用了一张加速卡,小鸡撸起袖子开始双手吃饲料,进食速度大大加快。\n')
print('\n 写入了一条动态。。。。。。\n')
file.close()
'''
你使用了一张加速卡,小鸡撸起袖子开始双手吃饲料,进食速度大大加快。
'''
写入文件后,一定要用close()
方法关闭,否则不会被成功写入。
向文件中写入内容时,如果打开文件采用w
(写入)模式,则先清空原文件的内容,再写入新的内容;如果想追加内容,使用a
(追加)模式:
print('\n','=' * 10, '蚂蚁庄园动态', '=' * 10)
file = open('message.txt', 'a')
file.write('mingri的小鸡在你的庄园待了22分钟,吃了6g的饲料之后,被你赶走了。\n')
print('\n 追加了一条动态。。。。。。\n')
file.close() # 关闭了文件的对象
'''
你使用了一张加速卡,小鸡撸起袖子开始双手吃饲料,进食速度大大加快。
mingri的小鸡在你的庄园待了22分钟,吃了6g的饲料之后,被你赶走了。
'''
12.1.5 读取文件
1. 读取指定字符
文件对象提供了read()
方法读取指定个数的字符。例如,要读取message.txt
文件中的前9个字符:
print('\n','=' * 10, '蚂蚁庄园动态', '=' * 10)
with open('message.txt', 'r') as file:
str = file.read(9)
print(str)
file.close() # 关闭了文件的对象
'''
========== 蚂蚁庄园动态 ==========
你使用了一张加速卡
'''
使用read(size)
方法读取文件时,是从文件的开头读取的。如果想要读取部分内容,可以先使用文件对象的seek()
方法将文件的指针移动到新的位置,然后再应用read(size)
方法读取。
print('=' * 10, '蚂蚁庄园动态', '=' * 10)
with open('message.txt', 'r') as file:
file.seek(12) # 从第12个字符开始 # 注意一个汉字占用2个字符 英文和数字各占1个字符
str = file.read(23) # 读取23个字符 # read()函数 均占用一个字符
print(str)
file.close() # 关闭了文件的对象
'''
========== 蚂蚁庄园动态 ==========
加速卡,小鸡撸起袖子开始双手吃饲料,进食速度大
'''
file.read()
表示读取文件中的所有内容。
print('=' * 10, '蚂蚁庄园动态', '=' * 10)
with open('message.txt', 'r') as file:
str = file.read()
print(str)
file.close() # 关闭了文件的对象
'''
========== 蚂蚁庄园动态 ==========
你使用了一张加速卡,小鸡撸起袖子开始双手吃饲料,进食速度大大加快。
mingri的小鸡在你的庄园待了22分钟,吃了6g的饲料之后,被你赶走了。
'''
2. 读取一行
文件对象提供了readline()
方法用于每次读取一行数据。
print('=' * 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', '=' * 35, 'over', '=' * 35, '\n')
file.close() # 关闭了文件的对象
'''
=================================== 蚂蚁庄园动态 ===================================
1 你使用了一张加速卡,小鸡撸起袖子开始双手吃饲料,进食速度大大加快。
2 mingri的小鸡在你的庄园待了22分钟,吃了6g的饲料之后,被你赶走了。
3 你的小鸡在QQ庄园里待了22分钟,吃了8g饲料,被庄园主人赶了回来。
4 你使用了一张加速卡,小鸡撸起袖子开始双手吃饲料,进食速度大大加快。
5 CC来到了你的庄园,并提醒你无语的小鸡已经偷吃了饲料21分钟,吃掉了6g,你的小鸡拿出了10g饲料奖励给CC。
=================================== over ===================================
'''
3. 读取全部行
读取全部行,使用的是文件对象的readlines()
方法,返回的是一个字符串列表:
下面的代码将读取的列表中的内容,换行打印了出来:
print('=' * 35, '蚂蚁庄园动态', '=' * 35, '\n')
with open('message.txt', 'r') as file:
message = file.readlines()
for line in message: # 不换行 就是列表的形式
print(line)
print('\n', '=' * 35, 'over', '=' * 35, '\n')
file.close() # 关闭了文件的对象
'''
=================================== 蚂蚁庄园动态 ===================================
你使用了一张加速卡,小鸡撸起袖子开始双手吃饲料,进食速度大大加快。
mingri的小鸡在你的庄园待了22分钟,吃了6g的饲料之后,被你赶走了。
你的小鸡在QQ庄园里待了22分钟,吃了8g饲料,被庄园主人赶了回来。
你使用了一张加速卡,小鸡撸起袖子开始双手吃饲料,进食速度大大加快。
CC来到了你的庄园,并提醒你无语的小鸡已经偷吃了饲料21分钟,吃掉了6g,你的小鸡拿出了10g饲料奖励给CC。
=================================== over ===================================
'''