读写文件就是请求操作系统打开一个文件对象,然后通过操作系统提供的接口从这个文件对象中读取数据,或把数据写入这个文件对象
一、读取文件
Python中通过内置的 open( )函数来读取文件
f = open('/Users/jie/Downloads/测试文件1.txt','r',encoding='utf-8')
open( ) 中传入要打开的”文件地址+文件名”,以及标示符’r’(r,表示只读)
通过 read( ) 函数对打开的文件进行内容全部的读取,文件内容以str对象放入内存中
f.read()
print(f.read()) # 欢迎来到精创学习!
print(type(f.read())) # <class 'str'>
读取完文件后,我们需要通过 close( ) 函数把文件进行关闭,文件使用完后需要被关闭,因为文件对象会占用系统资源,并且系统同一时间能打开的文件数量是有限制的
f.close() # 调用close()函数来关闭打开的文件来释放被占用的系统资源
通过上述代码,我们来结合try…except…finally来完成文件的打开-读取-关闭
def read_file(file_name='/Users/jie/Downloads/测试文件1.txt'):
f = None
try:
f = open(file_name,'r',encoding='utf-8')
r = f.read()
print(r)
except:
print("文件读取异常!")
finally:
if f:
f.close()
print('关闭打开的文件')
s = read_file()
这里定义了一个了函数 read_file(file_name) 来实现文件读取功能,函数中,给变量f默认值为None, 目的在于程序一执行就会自动创建变量f,供下面try: 和 finally: 语句调用;
问题:上述代码为什么要在一开始就定义变量: f 呢?
Python中 read( ) 函数会一次性读取文件的全部内容到内存中,试设想,如果这个文件非常庞大,那么内存就会溢出,因此在调用read( ) 函数读取文件时,要注意读取对象数据量,如果想按行读取可调用 readline( ),这样每次读取一行;调用 read(size) 方法,每次读取 size 个字节的内容,还有 readlines( ) 也是一次读取所有内容,但是按行读取,返回一个list,所以读取文件时要根据实际灵活运用上面三个函数。
readline( )
def read_file(file_name='C:\\Users\\37210\\Desktop\\测试文件1.txt'):
f = None
try:
f = open(file_name,'r',encoding='utf-8')
while f:
r = f.readline()
if r:
print(r)
else:
break
except BaseException as e:
print("文件读取异常!")
print(e)
finally:
if f:
f.close()
print('关闭打开的文件')
s = read_file()
这是文本第1行。
这是文本第2行。
这是文本第3行。
关闭打开的文件
readline()方法每次读取一行;返回的是一个字符串对象,保持当前行的内存;即通过循环按行读取。
readlines( )
def read_file(file_name='C:\\Users\\37210\\Desktop\\测试文件1.txt'):
f = None
try:
f = open(file_name,'r',encoding='utf-8')
r = f.readlines()
print(r) # ['这是文本第1行。\n', '这是文本第2行。\n', '这是文本第3行。\n']
for i in r: # 通过循环遍历这个list
print(i)
except BaseException as e:
print("文件读取异常!")
print(e)
finally:
if f:
f.close()
print('关闭打开的文件')
s = read_file()
['这是文本第1行。\n', '这是文本第2行。\n', '这是文本第3行。\n']
这是文本第1行。
这是文本第2行。
这是文本第3行。
关闭打开的文件
readlines( ) 方法一次性读取全部内容到内存,每一行字符串作为一个元素,返回一个list,可通过for循环来遍历这个list,获取每行内容
上述返回结果
['这是文本第1行。\n', '这是文本第2行。\n', '这是文本第3行。\n']
列表中每个元素都包含一个’\n’,即回车符,导致输出结果含有空行,这里可使用 replace( ) 函数来处理
for i in r:
i = i.replace('\n','') # 通过replace把'\n'替换成'',达到去除'\n'的目的
print(i)
这是文本第1行。
这是文本第2行。
这是文本第3行。
关闭打开的文件
任务:分别通过read( ) 、readline( ) 、readlines( ) 对文本完成打开-读取-关闭
任务:通过replace( ) 函数,把读取到的字符串中’。’代替为’!’
二、通过 with open …as…语句来打开一个文件
上述读取一个文件的操作是 :open-read-close,通过 with open 可简化步骤:with open-read
通过 with 关键字,当文件读取完毕,程序会自动关闭文件,无需调用 close( ) 函数
def read_file(file_name='C:\\Users\\37210\\Desktop\\测试文件1.txt'):
try:
with open(file_name,'r',encoding='utf-8') as f:
r = f.readlines()
print(r)
for i in r:
i = i.replace('\n','')
print(i)
except BaseException as e:
print("文件读取异常!")
print(e)
if f.closed: # 通过调用 f.closed 来判断打开的文件是否已关闭,已关闭返回True,否则返回False
print('文件已关闭')
s = read_file()
['这是文本第1行。\n', '这是文本第2行。\n', '这是文本第3行。\n']
这是文本第1行。
这是文本第2行。
这是文本第3行。
文件已关闭
任务:通过 whit open…as… 来改造上述代码的 read( ) 、readline( )
二、写入文件
写入文件的时open函数中 ‘r’ 改成 ‘w’,通过 f.write(要写入的内容) 来对文件进行写入操作,同样需要close( )函数来关闭打开的文件
def read_file(file_name='C:\\Users\\37210\\Desktop\\测试文件1.txt'):
f = None
try:
f = open(file_name,'w',encoding='utf-8')
w = f.write('写入第一句话。')
except BaseException as e:
print("写入文件异常!")
print(e)
finally:
if f:
f.close()
print('关闭打开的文件')
s = read_file()
此时打开’C:\Users\37210\Desktop\测试文件1.txt’文件,会发现文件中存在的是“写入第一句话。”字符串
通过 with open … as…来简化
def read_file(file_name='C:\\Users\\37210\\Desktop\\测试文件1.txt'):
try:
with open(file_name,'w',encoding='utf-8') as f:
f.write('写入第二句话。')
except BaseException as e:
print("写入文件异常!")
print(e)
s = read_file()
同样通过 with open … as ..来写入文件,可以省略close( )方法,上述通过参数 ‘w’ 来写入会直接覆盖原文件,把 ‘w’ 改成 ‘a’ 就可以实现追加的方式写入
def read_file(file_name='C:\\Users\\37210\\Desktop\\测试文件1.txt'):
try:
with open(file_name,'a',encoding='utf-8') as f: # 以追加的方式写入
f.write('写入第二句话。')
except BaseException as e:
print("写入文件异常!")
print(e)
s = read_file()
写入第一句话。写入第二句话。
打开’C:\Users\37210\Desktop\测试文件1.txt’文件,文件中:“写入第一句话。写入第二句话。”
如果,在写入操作时,file_name不存在,则程序会自动创建这个名称的文件,并写入数据。
任务:在桌面创建一个新的空文本文件,分别通过 open…write…close 的方式写入一句话
任务:对上一任务通过 with open…as… 来改造简化
任务:结合上一任务,以追加的形式写入