Python学习
第七天
回顾
我们前面说过变量、序列、对象,但变量、序列以及对象中存储的数据是暂时的,程序结束后就会丢失,如果希望程序结束后数据仍然保持,就需要将数据保存到文件中。Python提供了内置的文件对象,以及对文件、目录进行操作的内置模块,通过这些技术可以很方便地将数据保存到文件中。
Python文件基本操作
python中文件的操作通常可以分成两类:
1.系统级操作:删除、修改权限,作用于文件本身
2.应用级操作:读、写操作,作用于文件内容
思考:如何用word编写一份简历?
1、打开新建一个word文件;
2、写入个人信息并保存文件;
3、关闭word软件。
对于文件应用的操作通常有着较为固定的格式,可以归纳如下所示:
1.打开open文件,使用open()函数,返回一个文件对象;
2.读写read/write文件,这里主要有读文件有read(),readline(),readlines()函数;而写文件就有write()、writelines()函数;
3.关闭close文件,完成对文件的读写之后,需要对文件进行关闭,调用close()函数。
一个文件,必须在打开之后才能对其进行操作,并且在操作结束之后,还应该将其关闭,这 3 步的顺序不能打乱。
1、Python open函数
open函数
Python中如果想要操作文件,首先需要创建或者打开指定的文件,并创建一个文件对象,而这些工作可以通过内置的 open() 函数实现。
语法:file = open(file_name [, mode='r' [ , buffering=-1 [ , encoding = None ]]])
file_name:要创建或打开文件的文件名称,该名称要用引号(单引号或双引号都可以)括起来。需要注意的是,如果要打开的文件和当前执行的代码文件位于同一目录,则直接写文件名即可;否则,此参数需要指定打开文件所在的完整路径。
mode:可选参数,用于指定文件的打开模式。可选的打开模式如表 1 所示。如果不写,则默认以只读(r)模式打开文件。
注意:文件打开模式,直接决定了后续可以对文件做哪些操作。例如,使用 r 模式打开的文件,后续编写的代码只能读取文件,而无法修改文件内容。
r、只读模式打开文件,读文件内容的指针会放在文件的开头。
rb、以二进制格式、采用只读模式打开文件,读文件内容的指针位于文件的开头,一般用于非文本文件,如图片文件、音频文件等。
r+、打开文件后,既可以从头读取文件内容,也可以从开头向文件中写入新的内容,写入的新内容会覆盖文件中等长度的原有内容。
rb+、以二进制格式、采用读写模式打开文件,读写文件的指针会放在文件的开头,通常针对非文本文件(如音频文件)。
w、以只写模式打开文件,若该文件存在,打开时会清空文件中原有的内容。
wb、以二进制格式、只写模式打开文件,一般用于非文本文件(如音频文件)
w+、打开文件后,会对原有内容进行清空,并对该文件有读写权限。
wb+、以二进制格式、读写模式打开文件,一般用于非文本文件
a、以追加模式打开一个文件,对文件只有写入权限,如果文件已经存在,文件指针将放在文件的末尾,反之则会创建新文件。
ab、以二进制格式打开文件,并采用追加模式,对文件只有写权限。如果该文件已存在,文件指针位于文件末尾,反之则会创建新文件。
a+、以读写模式打开文件;如果文件存在,文件指针放在文件的末尾,反之则会创建新文件。
ab+、以二进制模式打开文件,并采用追加模式,对文件具有读写权限,如果文件存在,则文件指针位于文件的末尾;反之,则创建新文件。
buffering:可选参数,用于指定对文件做读写操作时,是否使用缓冲区。
通常情况下、建议大家在使用 open() 函数时打开缓冲区,即不需要修改 buffing 参数的值。
如果 buffing 参数的值为 0(或者 False),则表示在打开指定文件时不使用缓冲区;如果 buffing 参数值为大于 1 的整数,该整数用于指定缓冲区的大小(单位是字节);如果 buffing 参数的值为负数,则代表使用默认的缓冲区大小。
encoding:手动设定打开文件时所使用的编码格式,不同平台的 ecoding 参数值也不同,以 Windows 为例,其默认为 cp936(实际上就是 GBK 编码)。
open()文件对象常用的属性
成功打开文件之后,可以调用文件对象本身拥有的属性获取当前文件的部分信息,其常见的属性为:
file.name:返回文件的名称;
file.mode:返回打开文件时,采用的文件打开模式;
file.encoding:返回打开文件时使用的编码格式;
file.closed:判断文件是否己经关闭。
import os
file = open('1.txt','r')
print(file.mode) # 'r'
print(file.encoding) # cp936
print(file.name) # 1.txt
print(file.close()) # None
注意,使用 open() 函数打开的文件对象,必须手动进行关闭,Python 垃圾回收机制无法自动回收打开文件所占用的资源。
2、Python read函数
Python提供了如下 3 种函数,它们都可以帮我们实现读取文件中数据的操作:
1、read() 函数:逐个字节或者字符读取文件中的内容;
借助 open() 函数,并以可读模式(包括 r、r+、rb、rb+)打开的文件,可以调用 read() 函数逐个字节(或者逐个字符)读取文件中的内容。
格式:file.read([size])
file 表示打开的文件对象;size 作为一个可选参数,用于指定要读取的字符个数,如果省略,则默认一次性读取所有内容。
# import os
# file = open('1.txt','r') # 1.txt中是中文
# str = file.read(3)
# print(str)
# file.close()
# 'gbk' codec can't decode byte 0xac
import os
file = open('1.txt','r',encoding='utf-8')
str = file.read(3)
print(str) # 哈哈哈
file.close()
2、readline() 函数:逐行读取文件中的内容;
readline() 函数用于读取文件中的一行,包含最后的换行符“\n”。此函数的基本语法格式为: file.readline([size])。
import os
file = open('1.txt','r',encoding='utf-8')
str = file.readline()
print(str) # 我是第一行第一列数据 我是第一行第二列数据
file.close()
注意:由于 readline() 函数在读取文件中一行的内容时,会读取最后的换行符“\n”,再加上 print() 函数输出内容时默认会换行,所以输出结果中会看到多出了一个空行,实际在控制台的效果是两行。
3、readlines() 函数:一次性读取文件中多行内容。
readlines() 函数用于读取文件中的所有行,和 readline() 函数一样,readlines() 函数在读取每一行时,会连同行尾的换行符一块读取。
import os
file = open('1.txt','r',encoding='utf-8')
str = file.readlines()
print(str)
file.close()
# ['我是第一行第一列数据 我是第一行第二列数据\n', '我是第二行第一列数据 我是第二行第二列数据']
3、Python write函数
前面我们说了使用 read()、readline() 和 readlines() 这 3 个函数读取文件,如果我们想把一些数据保存到文件中,又该如何实现呢?这个时候就需要用到python中的write、writelines函数了。
1、write函数
语法:file.write(string)
其中,file 表示已经打开的文件对象;string 表示要写入文件的字符串(或字节串,仅适用写入二进制文件中)。
注意,在使用 write() 向文件中写入数据,需保证使用 open() 函数是以 r+、w、w+、a 或 a+ 的模式打开文件,否则执行 write() 函数会抛出 io.UnsupportedOperation 错误。
import os
file = open('2.txt','w',encoding='utf-8')
file.write('首次写入数据')
file.close()
注意:打开文件模式中包含 w(写入),那么向文件中写入内容时,会先清空原文件中的内容,然后再写入新的内容。因此运行上面程序,再次打开 a.txt 文件,只会看到新写入的内容。
追加模式打开文件,则不会清空原有内容,而是将新写入的内容会添加到原内容后边。
import os
file = open('2.txt','a',encoding='utf-8')
file.write('首次写入数据5\n')
file.close()
注意:不论是采用那种方式写入数据,file.close不可缺少。当我们在写入文件内容时,操作系统不会立刻把数据写入磁盘,而是先缓存起来,只有调用 close() 函数时,操作系统才会保证把没有写入的数据全部写入磁盘文件中。
2、writelines函数
Python 的文件对象中,不仅提供了 write() 函数,还提供了 writelines() 函数,可以实现将字符串列表写入文件中。
# 将一个文件中所有内容复制到另一个文件
import os
open_file = open('1.txt','r',encoding='utf-8')
write_file = open('3.txt','w',encoding='utf-8')
write_file.writelines(open_file.read())
write_file.close()
open_file.close()
注意:使用 writelines() 函数向文件中写入多行数据时,不会自动给各行添加换行符。
4、Python tell和seek
1、Python tell函数
tell() 函数用于判断文件指针当前所处的位置。语法:file.tell()。
import os
read_file = open('2.txt','r',encoding='utf-8')
print(read_file.tell()) # 0
print(read_file.read(3)) # 日照香
print(read_file.tell()) # 9
read_file.close()
#utf-8编码:一个中文包含繁体字等于三个字节,一个英文字符一个字节。
#gbk编码:一个中文包含繁体字等于二个字节,一个英文字符一个字节。
2、Python seek函数
seek() 函数用于将文件指针移动至指定位置,该函数的语法格式如下:
file.seek(offset[, whence])
各个参数的含义如下:
offset:表示相对于 whence 位置文件指针的偏移量,正数表示向后偏移,负数表示向前偏移。例如,当whence == 0 &&offset == 3
(即 seek(3,0) ),表示文件指针移动至距离文件开头处 3 个字符的位置;当whence == 1 &&offset == 5
(即 seek(5,1) ),表示文件指针向后移动,移动至距离当前位置 5 个字符处。
whence:作为可选参数,用于指定文件指针要放置的位置,该参数的参数值有 3 个选择:0 代表文件头(默认值)、1 代表当前位置、2 代表文件尾。
注意,当 offset 值非 0 时,Python 要求文件必须要以二进制格式打开,否则会抛出 io.UnsupportedOperation 错误。
read_file = open('2.txt','rb') # 二进制不要设置编码集
print(read_file.tell()) # 指针初始位置 0
print(read_file.read(1))
print(read_file.tell()) # 1
read_file.seek(5) # 将文件指针从文件开头,向后移动到 5 个字符的位置
print(read_file.tell()) # 5
print(read_file.read(1))
read_file.seek(5,1)
print(read_file.tell()) # 11
read_file.close()
5、Python with as使用
Python中使用 with as 语句操作上下文管理器(context manager),它能够帮助我们自动分配并且释放资源。使用 with as 操作已经打开的文件对象,无论期间是否抛出异常,都能保证 with as 语句执行完毕后自动关闭已经打开的文件。
语法:
with 表达式 [as target]:
代码块
import os
with open('4.txt','w') as w_file:
w_file.write('Good Job')
优点:
1、自动释放对象,不需要我们手动close;
2、优化try/catch,导致代码复杂化;
3、保障程序的正常执行。