时间:2021/09/04
文章目录
1.文件的使用
- 文件是存储在辅助存储器上的一组数据序列,可以包含任何数据内容。
- 概念上,文件是数据的集合和抽象
- 文本文件
- 二进制文件
1.1 文件的类型
- 文本文件一般有单一特定编码的字符组成,如UTF-8编码,方便内容统一展示和阅读
- 由于文本文件存在编码,所以,可以被看作是存储在磁盘上的长字符串,如一个txt格式的文本文件(记事本)
- 二进制文件直接由比特0和比特1组成,没有统一的字符编码,文件内部数据的组织格式与文件用途有关。
- 二进制是信息按照非字符但有特定格式形式的文件,如png格式的图片文件、avi格式的视频文件。
- 二进制文件和文本文件最主要的区别在于是否有统一的字符编码。
二进制文件没有统一的字符编码,只能当作字节流,而不能看作是字符串。
- 无论文件创建位文本文件或二进制文件,都可以用“文本文件方式”和“二进制文件方式”打开,但打开后的操作不同。
- 以文本文件方式打开
file=open('a.txt','rt') # "t"表示以文本文件方式打开
print(file.readline())
file.close()
- 以二进制方式打开
file=open('a.txt','rb') # b表示以二进制方式打开
print(file.readline())
file.close()
输出十六进制数
总结:
- 采用文本方式读入文件,文件经过编码形成字符串,打印出有含义的字符。由于存在编码,字符串中的一个字符由多个字节(0和1)表示
- 采用二进制方式打开文件,文件被解析为字节流。即特定的数字串
1.2 文件的打开和关闭
- python对文本文件和二进制文件采用统一的操作步骤,即“打开-操作-关闭”
- 操作系统中的文件默认处于存储状态,打开不存在的文件系统可以创建这个文件。
- 打开后的文件处于占用状态,此时,另一个进程不能操作这个文件。
- 可以通过一组方法读取文件的内容或向文件写入内容,操作之后需要将文件关闭,关闭将释放对文件的控制使用,文件恢复成存储状态
- python通过open()函数打开一个文件,并返回一个操作这个文件的变量
- 语法结构
变量名 = open(文件路径及文件名 , 打开模式)
open()函数有两个参数:
- 文件名
- 文件名可以是文件的实际名,也可以是包含完整路径的名字
- 打开模式
- 打开模式用于控制使用何种方式打开文件,open()函数提供了7种基本的打开模式。
- 文件的打开模式:
打开模式 | 含义 |
---|---|
r | 只读模式,如果文件不存在,返回异常FileNotFoundError,默认值 |
w | 覆盖写模式,文件不存在则创建,存在则完全覆盖原文件 |
x | 创建写模式,文件不存在则创建,存在则返回异常FileExistsError |
a | 追加写模式,文件不存在则创建,存在则在原文件最后追加内容 |
b | 二进制文件模式 |
t | 文本文件模式,默认值 |
+ | 与r/w/x/a一同使用,在原功能基础上增加同时读写功能 |
- 打开模式使用字符串方式表示,根据字符串定义,单引号或者双引号均可。
- 上述打开模式中,r,w,x,a或以和b,t,+组合使用,形成既表达读写又表达文件模式的方式
打开文件有一些常用组合,如下:
- 以文本方式只读打开一个文件,读入后不能对文件进行修改
变量名 = open(文件名,'r')
变量名 = open(文件名)
- 以文本方式可读写地打开一个文件,可以读入并修改文件
变量名 = open(文件名,'r+')
- 以文本方式打开一个空文件,准备写入内容,并保存在新文件
变量名 = open(文件名,'w')
- 以文本方式打开一个空文件或已有文件,追加形式写入内容,更新原文件
变量名 = open(文件名,'a+')
- 以二进制方式只读打开一个文件,读入后不能对文件进行修改
变量名 = (文件名,'rb')
- 文件使用结束后要用close()方法关闭,释放文件的使用授权
变量名.close()
题目:
新建一个文本文件a.txt,其内容是“哈哈哈哈哈哈”,保存在目录PATH中,此时路径是E盘的python中的”课堂练习“。打开并关闭该文件的操作过程。
注: "\“是字符串中的转义字符,所以表示路径是,使用”\\“或”/"代替
# 定义文件路径
PATH='E:\\Python\\课堂练习\\'
# 文本打开方式
f=open(PATH+'A.txt','rt')
print(f.readline())
# 关闭文件
# 当文件关闭后,再对文件进行读取将产生I/O操作错误,即不能被读取
f.close()
注意文件的编码形式
记事本方式打开-文件-另存为
1.3 文件的读写
- 根据打开方式不同,文件读写也会根据文本文件或二进制打开方式有所不同
方法 | 含义 |
---|---|
f.read(size=-1) | 从文件中读入整个文件内容。参数可选,如果给出,读入前size长度的字符串或字节流 |
f.readline(size=-1) | 从文件中读入一行内容。参数可选,如果给出,读入该行前size长度的字符串或字节流 |
f.readlines(hint=-1) | 从文件中读入所有行,以每行为元素形成一个列表。参数可选,如果给出,读入hint行 |
f.seek(offset) | 改变当前文件操作指针的位置,offset的值:0为文件开头;2为文件结尾 |
- 如果文件以文本文件方式打开,则读入字符串;如果文件以二进制方式打开,则读入字节流。
题目:
如下是一个文件的内容,保存在bar.txt,存储路径是E盘的python中的”课堂练习“。对bar.txt文件的读入实例如下
”新年都未有芳华,二月初惊现草芽。
白雪却嫌春色晚,故穿庭树作飞花。“
解析:
如果文件不大,可以一次性将文件内容读入,保存在程序内部变量中。f.read()是最常用的一次性读入文件的函数,其结果是一个字符串。
# 路径 文件名
f=open('E:\\Python\\课堂练习\\bar.txt','r')
# 变量s保存读入内容
s=f.read()
print(s)
f.close()
f.readlines()也是一次性读入文件的函数,其结果是一个列表,每个元素是文件的一行
f=open('E:\\Python\\课堂练习\\bar.txt','r')
# 变量lst保存读入内容
lst=f.readlines()
print(lst)
f.close()
文件打开后,对文件的读写有一个读取指针,当从文件中读入内容后,读取指针将向前进,再次读取的内容将从指针的新位置开始。
f=open('E:\\Python\\课堂练习\\bar.txt','r')
# 变量s保存读入内容
s=f.read()
print(s)
print('-----------')
# 变量lst读取不到内容
lst=f.readlines()
print(lst)
f.close()
解析:
- 因为之前发f.read()方法已经读取了文件全部内容,读取指针在文件末尾
- 再次调用f.readlines()方法无法从当前读取指针处读取内容,因此返回结果为空
f.seek()方法能够移动读入指针的位置,f.seek(0)将读取指针移动到文件开头,f.seek(2)将读取指针移动到文件结尾。
f=open('E:\\Python\\课堂练习\\bar.txt','r')
# 变量s保存读入内容
s=f.read()
print(s)
print('-----------')
# 将读取指针移到开头
f.seek(0)
# 变量lst保存读入内容
lst=f.readlines()
print(lst)
f.close()
从文本文件中逐行读入内容,并进行处理是一个基本的文件操作需求。文本文件可以看作是由行组成的组合类型,因此,可以使用遍历循环行遍历文件。
- 语法格式:
f=open(文件路径及名称,'r')
for line in f:
print(line)
f.close()
f=open('E:\\Python\\课堂练习\\bar.txt','r')
for line in f:
print(line)
f.close()
文件写入方法:
方法 | 含义 |
---|---|
f.write(s) | 向文件写入一个字符串或字节流 |
f.writelines(lines) | 将一个元素为字符串的列表整体写入文件 |
f.write(s)向文件写入字符串s,每次写入后,将会记录一个写入指针。该方法可以反复调用,在写入指针后分批写入内容,直到文件被关闭。
# 写模式打开一个文件
f=open('E:\\Python\\课堂练习\\bar.txt','w')
f.write('新年都未有芳华,\n')
f.write('二月初惊现草芽。\n')
f.write('白雪却嫌春色晚,\n')
f.write('故穿庭树作飞花。\n')
f.close()
f.writelines(lines)直接将列表类型的各元素连接起来写入文件f。
lst=['新年都未有芳华,','二月初惊现草芽。',\
'白雪却嫌春色晚,','故穿庭树作飞花。']
# 写模式打开文件
f=open('E:\\Python\\课堂练习\\bar.txt','w')
# 调用写方法
f.writelines(lst)
f.close()
2.数据组织的维度
一组数据在被计算机处理前需要进行一定的组织,表明数据之间的基本关系和逻辑,进而形成数据“数据的维度”。
- 一维数据
- 二维数据
- 高维数据
2.1 一维数据
- 由对等关系的有序或无序数据构成,采用线性方式组织,对应于数学中数组的概念。
- 一维数据具有线性特点,任何表现为序列或集合的内容都可以看作是一维数据。
2.2 二维数据
- 也称表格数据,由关联关系数据构成,采用二维表格方式组织,对应于数学中的矩阵,常见的表格都属于二维数据。
2.3 高维数据
- 由键值对类型的数据构成,采用对象方式组织,可以多层嵌套。
- 高维数据相比一维数据和二维数据能表达更加灵活和复杂的数据关系
3.一维数据的处理
3.1 一维数据的表示
- 一维数据是最简单的数据组织类型,由于是线性结构,在python中主要采用列表形式表示。
- 采用列表类型表示一维数据的时候,需要注意每个数据的数据类型。
一维数据的文件存储有多种方式,总体思路是采用特殊字符分隔各数据。
- 采用空格分隔元素,
北京 上海 天津 重庆 - 采用逗号分隔元素,
北京,上海,天津,重庆 - 使用换行分隔元素,
北京
上海
天津
重庆 - 其他特殊符号分隔,
北京:上海:天津:重庆
这4中方法中,逗号分隔的存储格式叫CSV格式(Comma-Separated Values,即逗号分隔值),它是一种通用,相对简单的文件格式。
- 存储的文件一般采用.csv为扩展名
列表对象输出为CSV格式文件方法如下,采用字符串的join()方法
lst=['北京','上海','天津','重庆']
f=open('E:\\Python\\课堂练习\\acity.csv','w')
f.write(','.join(lst)+'\n')
f.close()
3.2 一维数据的处理
- 对一维数据进行处理,首先需要从CSV格式文件读入一堆数据,并将其表示为列表对象。
- 从CSV文件中获取内容时,最后一个元素后面包含了一个换行符("\n")
- 对于数据的表达和使用来说,这个换行是多余的,需要采用字符串的strip()方法去掉数据尾部的换行符,进一步使用split()方法以逗号进行分隔。
f=open('E:\\Python\\课堂练习\\acity.csv','r')
lst=f.read()
print(lst)
# 读取到的是一个字符串类型
print(type(lst))
f.seek(0)
lst=f.read().strip('\n').split(',')
print(lst)
# 读取到的是一个列表类型
print(type(lst))
f.close()
4.二维数据的处理
4.1 二维数据的表示
- 二维数据由多个一维数据构成,可以看作是一维数据的组合形式。
- 二维数据可以采用二维列表来表示,即列表的每个元素对应二维数据的一行,这个元素本身也是列表类型
提示:
- 二维数据的数据类型一般采用相同的数据类型存储数据,便于操作。
- 尽管在二维数据中存在大量数值,但由于本例中数值坐在行或列不都是数字,存在字符文本,因此,将数值统一表示为字符串形式
4.2 二维数据的存储
- 二维数据由以为数据组成,用CSV格式文件存储
- CSV文件的每一行是一维数据,整个CSV文件是一个二维数据。
- 二维列表对象输出为CSV格式文件方法如下
lst=[
['指标','2021年','2021年','2019年'],
['居民消费价格指数','164','131.5','665'],
['食品','13.2','563.2','894.5']
]
# 写方式打开文件
f=open('E:\\Python\\课堂练习\\api.csv','w')
# for遍历循环写入
for row in lst:
f.write(','.join(row)+'\n')
f.close()
4.3 二维数据的处理
- 对二维数据进行处理,首先需要从CSV格式文件读入二维数据,并将其表示位二维列表对象。
f=open('E:\\Python\\课堂练习\\api.csv','r')
lst=[]
for line in f:
lst.append(line.strip('\n').split(','))
f.close()
print(lst)
- 二维数据处理等同于二维列表的操作。
- 于一维列表不同,二维列表一般需要借助循环遍历实现对每个数据的处理。
- 语法结构
for row in lst:
for item in row:
对第row行第item列元素进行处理
f=open('E:\\Python\\课堂练习\\api.csv','r')
lst=[]
for line in f:
lst.append(line.strip('\n').split(','))
f.close()
for row in lst:
line=''
for item in row:
line+='{:10}\t'.format(item)
print(line)