开通博客写的第一篇文章就是关于python的,今天这篇文章是关于IO编程操作的,IO的内容也不少,以后想到什么会继续补充。
目录
1、文件的使用
文件是存储在辅助存储器上的一组数据序列,可以包含任何数据内容。概念上来说,文件是数据的集合和抽象
1.1、文件的类型
文件包括文本文件和二进制文件两种类型
文本文件一般由单一特定编码的字符组成,如UTF-8。由于文本文件存在编码,所以它可以被看做是存储在磁盘上的长字符串,如txt格式的文本文件。
二进制文件直接由比特0和比特1组成,没有统一的字符编码,文件内部数据的组织格式与文件用途有关。二进制是信息按照非字符但有特定格式形成的文件,如png格式的图片文件、avi格式的视频文件。
二进制文件和文本文件的区别在于是否有统一的字符编码,二进制文件由于没有统一的字符编码,只能当作字节流,而不能看做是字符串。
1.2 文件的打开和关闭
Python中是通过open()函数打开一个文件的,并返回一个操作这个文件的变量:
<变量名> = open(<文件路径及文件名>,<打开模式>)
f = open('D:/text.txt','rt')
open()函数一般包含两个参数:文件名和打开模式。
打开模式 | 含 义 |
'r' | 只读模式,若文件不存在,返回异常FileNotFoundError |
'w' | 覆盖写模式,文件不存在则创建,存在则覆盖原文件 |
'x' | 创建模式,文件不存在则创建,存在返回异常FileExistsError |
'a' | 追加模式,文件不存在则创建,存在在原文件后追加内容 |
'b' | 二进制文件模式,读入字节流 |
't' | 文本文件模式,读入字符串 |
'+' | 与/r/w/x/a一起使用,在原功能上增加同时读写功能 |
'r'、'w'、'x'、'a'不能同时使用,但是可以和'b'、't'、'+'组合使用。
文件使用结束后,用close()方法关闭,以释放操作系统中的资源。
由于进行I/O操作时可能会IOError,这时候就close()方法就无法执行了,为了避免这种情况发生通常用try...finally语句
try:
f = open('D:/test.txt','rt')
print(f.read())
finally:
if f:
f.close()
python中的with语句可以更简洁的达到这种效果:
with open('D:/test.txt','r') as f:
print(f.read())
代码变得更简洁了,而且不用调用close()方法了。比较推荐使用这种方式
当然,open()函数还可以有encoding参数,比如通过encoding = 'gbk'将文件打开为‘gbk’编码形式。
1.3文件的读写
上面通过open()方法只能创建一个文件对象f,但是我们无法获取文件中的内容,也无法向文件中写入内容。实际上f对象是有读写方法的,接下来从读文件和写文件进行说明。
1.3.1文件的读取方法:
方法 | 含义 |
f.read(size = -1 ) | 读取整个文件的内容。 size设定读入的长度(下同) |
f.readline(size = -1) | 从文件中读入一行内容 |
f.readlines(size = -1) | 从文件中读入所有行,以每行为元素形成一个列表 |
f.seek(offset) | 改变当前文件操作指针的位置,offset值:0为文件开头;2为文件结尾 |
我在test.txt文件中写了《悯农》这首诗
我们来看看读操作,f.read()是最常用的一次性读入文件的格式
f.readlines()也是一次性读入文件的函数,其结果是一个列表,每个元素是文件的一行
文件打开后,对文件的读写有一个读取指针,当从文件中读入内容后,读取指针将向前进,再次读取读取的内容将从指针的新位置开始。
可以看到,进行了一次读操作后,再进行读操作,返回值为空。在上面的表中,有个seek()函数,我们可以使用f.seek(0)把读取指针移动到文件的开头
f.readline()是一行行的读取:
我们还可以使用for遍历循环来对文本每一行进行打印或者其他处理。逐行遍历文件仅针对文本方式,二进制方式打开没有行的概念。
文件的读取有三种方法,那么怎么进行选择呢。如果文件很小,read()一次性读取最方便;如果不能确定文件大小,反复调用read(size)比较保险;如果是配置文件,调用readlines()最方便。
1.3.2文件的写入方法
方法 | 含义 |
f.write(s) | 向文件写入一个字符串 |
f.writelines(lines) | 将元素作为字符串的列表整体写入文件 |
文件的写入和读取是相似的,唯一的不同就是把open()中的打开模式换为‘w’或‘wb’来打开文本文件或者二进制文件。‘w’是覆盖写模式,所以把test.txt文件中的《悯农》改成《静夜思》可以这样操作
使用write时,需要显式的用'\n'对写入的文本进行分行。
如果想在《静夜思》基础上再写入《登鹳雀楼》,可以这么操作,将open()中的打开模式设置为追加模式
f.writelines()直接将列表类型的各元素连接起来写入文件f,一行代表一个元素。
将会在D/:路径下创建demo.txt文本文件。
一般文本文件和二进制文件会这样读取,用python做图像处理时,有专门的图像处理第三方库,里面包含一些图片读写的函数,把图片以矩阵的形式读入。
2、数据组织的维度
一组数据在被计算机处理前需要进行一定的组织,表明数据之间的基本关系和逻辑,进而形成数据的维度。根据数据的关系不同,数据组织可以分为:一维数据、二维数据和高维数据。
2.1、一维数据的处理
一维数据是最简单的数据组织类型,python中主要采用列表形式表示。其中用逗号分隔元素的格式为CSV格式(即逗号分隔值),它是一种通用的文件格式,一般采用.csv为扩展名。
将列表对象输出为CSV格式文件的方法如下:
ls = ['人生苦短','我用python','我爱中国']
f = open('D:/test.csv','w')
f.write(','.join(ls) + '\n')
f.close()
生成的test.csv文件可以用excel打开。
因为对文本文件进行I/O操作,得到的是字符串,所以对数据进行处理时,会用到一些字符串相关的函数。
对以为数据进行处理,首先要从CSV格式文件中读入以为数据,并将其表示为列表对象,但是从CSV文件获得内容时,最后一个元素后面包含了一个换行符('\n'),需要采用字符串的方法strip()去掉尾部的换行符,进一步使用split()方法进行分割
f = open('D:/test.csv','r')
ls = f.read().strip('\n').split(',')
print(ls)
f.close()
实际上python的第三方库pandas中的read_csv()函数可以直接将CSV文件读入为DataFrame格式。
2.2、二维数据的处理
二维数据可以看成由多个以为数据组成,也就是一维数据的组合形式。
# CSV文件的每一行都是一维数据,整个CSV文件是二维数据
ls = [
['姓名','学号','语文成绩','数学成绩','英语成绩','排名'],
['小明','123456','100','100','100','1'],
['小华','111111','90','90','90','2'],
['小红','222222','80','80','80','3'],
['小亮','333333','70','70','70','4'],
]
#采用循环遍历和字符串的join()方法结合将二维列表对象输出为CSV格式文件
f = open('D:/class.csv','w')
for row in ls:
f.write(','.join(row) + '\n')
f.close()
用Excel打开CSV文件如下图所示:
参考文献:
Python手册