持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第9天,点击查看活动详情
之前讨论了几天基础,好多小伙伴肯能觉得Python学习太枯燥了,实际上任何一门语言在入门的时候都是类似的,所以,想学好一门编程语言必须要通过一端枯燥的打基础时间,然后到达可以自己实现功能的时候,学习的兴趣也就可以维持了,因为,自己的功能运行起来是一件很有成就感的事情。
那么今天我们聊一个具体的编程问题,就是对文件的操作,各种编程语言都有对文件的操作,Python也不例外:
最基础的有 file操作对象
再上层有 xlrd,opencv,xlwt这些针对不同文件的三方模块
在高级有numpy,pandas这些对三方模块进行封装的模块
所以,Python提供了丰富的文件操作模块,一方面可以使用这些模块完成工作,另一方面可以通过这些模块(尤其是三方模块)对Python文件操作有更加深刻的影响。
这里我们讨论一下Python文件操作的基本对象,file对象。
文件对象
首先这里要强调一句话,Python是一门面向对象的语言,所以Python本身把对文件的操作封装到了一个叫做file的对象当中,然后对文件操作基于这个对象进行展开,这个是需要在学习之前进行明确的,然后要关注下面的点:
1)Python文件对象在2版本可以通过file和open内置方法进行创建,但是在3版本只能使用open方法。
2)计算机对文件的操作通常来说是三种:读,写,执行,当然Python也可以做到,但是file对象主要是对文件内容的操作,也就是读和写。
创建open对象
open(file, mode='r'....)
open对象有很多参数,常用的是前两个,后面的参数我们会在之后的文章当中讨论,先说第一个参数:
1)第一个参数是文件的路径。
2)这里要刻意的注意一个问题,如果我们对一个文件进行写操作,哪怕这个文件本来不存在,计算机也会自动创建,但是如果是读操作,那么文件不存在是会报错的。
3)同理,可以有n个人同时读一个文件,但是同一时间节点只能有一个人写文件(这里涉及到文件的锁问题,后续细聊,嘿嘿嘿)。
4)python当中有一个对初学者最友善的操作路径,就是脚本文档的当前路径,这个路径默认可以搜索到,所以初学的小伙伴可以先把要操作的文件和脚本放到一个目录下(好像,在工作当中有这样刻意的行为)
文件权限
上面聊了文件对象和open的第一个参数,那么这里要详细的说一下open的第二个参数,open的第二个参数是权限,操作文件的时候需要声明对文件操作的权限,读权限不可以写,写权限不可以读,原因很简单,就是我们上面提了一下的文件锁的问题。常用的open文件操作权限有以下几种:
| 权限 | 描述 |
|---|---|
| r | 读 |
| w | 覆盖写 |
| a | 追加写 |
| rb | 二进制读 |
| wb | 二进制写 |
我们一一进行解释:
r 读权限,也是文件对象默认的权限,通过这个权限创建的文件只可以进行读操作。
w写权限,通过这个权限刻意进行文件写操作,但是要注意的是写入会把之前的内容覆盖掉(假使你对自己电脑里随机的一般文件进行了w权限的写,并且写入了空,嘿嘿嘿)
a 写权限,针对w权限来说,a权限最大的特点就是不覆盖,而是在内容尾部追加。
rb 也是读权限,但是针对的是二进制或者超文本数据,不让1.avi, 2.jpg, 3.mp3,嘿嘿嘿
wb 是写权限,同样是二进制写入,(如果你把一个网上的视频先二进制读,然后二进制写入到本地,那么,会不会....)
但是这里要注意,尤其是window上的小伙伴,文件操作一定要注意文件后缀,不同文件后缀进行读写拼装可能乱码的,比如xls和xlsx
文件操作
上面聊了关于文件的权限,那么下面来看一下文档的操作,首先是一个基本的操作结构:
f = open("1.txt") #阵列打开了当前脚本下的1.txt文件,并且采用了默认的读权限
print(f.read()) #读文件里的内容
f.close() #操作完成之后一定要关闭文件,为啥,因为我们需要释放内存
后来老师有人忘记关闭文件释放内存,所以有了新的写法:
with open("1.txt") as f:
print(f.read())
with 语句会在自己缩进的语句块执行完自动回收内存,这个是不是比上面的要简略一些
ok,基于上面的结构来看一下常见的文件操作:
操作之前要先声明一个概念,Python的文件是有指针概念的,啥意思,最简单的说,在一次文件操作当中,文件当中会有一个指针随着文件操作移动,比如,读过第一行,下次就会从第二行开始读。
| 操作 | 描述 |
|---|---|
| read() | 读全文,以一个字符串的格式返回回来,如果文件大,会很卡。 |
| readline() | 读一行,下次读下一行 |
| white | 写入数据,接收字符串对象 |
| whitelines | 不是写多行,而是刻意接收一个数组对象 |
| seek | 移动指针,但是他有2个参数,第一个是移动的长度,这里指的是字节,在移动中文的时候如果移动到汉字的一半会乱码,第二个参数是相对位置,有三种参数:0,代表从开头移动;1,代表从当前位置移动; 2,代表从文件尾部移动 |
| tail | 返回文件当前指针的位置,和seek结合会很nice |
文件的基础知识先讲这么多,周后我们会单独聊聊常见的文件操作案例,大家先熟悉一下基础部分的内容吧。