导读为了解答大家初学Python时遇到各种常见问题,小灯塔特地整理了一系列从零开始的入门到熟练的系列连载,每周五准时推出,欢迎大家学积极学习转载~
Python文件操作
文件
什么是文件?
可能上图是你脑海中迅速闪过的可能
文件是存储在外部介质的数据集合,通常可以长久保存(前提是这个介质不易损坏)
通俗点说,文件就是存放数据的地方
2
绝对路径与相对路径
通常,我们使用电脑的时候,例如编写了一段代码,我们要把这段代码保存,方便下次使用
你可能会把这段代码保存在硬盘某个位置【坏笑
如果在Python中,我们要打开这个文件操作,该怎么操作呢?
就像大象装冰箱需要三步:
1.打开冰箱门
2.将大象放进去
3.关上冰箱门
【我的天 好残忍啊】
所以要打开这个文件操作也需要3个步骤:
1.找出文件存放的路径,打开文件
2.对文件修改操作
3.关闭文件
说到找出文件的存放路径,我们就必须讲讲绝对路径和相对路径的概念
3
绝对路径
绝对路径指的是从最初的硬盘开始一直进入到文件位置
例如下图
学习资料.avi 的绝对路径是 D盘/学习资料文件夹/这真的是学习资料文件夹/学习资料.avi
4
相对路径
相对路径指的是当前所在位置继续向文件所在位置进发,例如我现在就在 学习资料文件夹 位置
那么,在这个位置要打开 学习资料.avi 文件
则相对位置是 这真的是学习资料文件夹/学习资料.avi
在Python中文件路径有两种表示方式,以我电脑上的 爬取某社区高清无码大图 文件为例
Python绝对路径写法:
E:\编程学习资料\爬取某社区高清无码大图.py
E:/编程学习资料/爬取某社区高清无码大图.py
划重点:大家应该注意到了,用双反斜线或者斜线区分层次
Python相对路径写法:
如果我Python从编程学习资料文件夹对这个py文件操作
相对路径写为: 爬取某社区高清无码大图.py
顺便说一句,我们装的anaconda默认在c盘某个管理员用户的目录
例如这样:
用户目录是123456(一般是你的电脑名称,桌面右键计算机可以看到)
则当你在默认位置启动Python,并且在Python中药打开一个文件时,可以直接将该文件放在123456这个目录里
直接写相对路径(这里是文件名)即可
我们演示一下:
例如我们要打开:
在Python中可以这样操作:
我们打开jupyter
说明默认位置确实是123456文件夹
我们在同一个目录下新开一个代码文档
我们已经打开了图片
小明:老湿!你个骗子!图片呢!!!
其实,返回的一串文字意思是说图片已经打开在内存中了,只不过还没显示出来
小明:老湿,快让图显示出来啊!
小明啊,不要急
我们刚才所用的是相对路径打开
如果是绝对路径打开,是这样的:
以上没有报错,并且出现了内容,说明打开成功
如果我们随便改个文件不存在的路径呢?
比如说,改成 D 盘:
通过报错信息,我们可以看出,提示是没有这个文件或者这个路径
当然这里我们 D 盘并没有这个路径
小明:老湿!说好的看图啊!!
好吧,我们看看这张图的内容
我们需要导入一个模块来针对图片做处理:
我们运行完会弹出一个窗口,图片内容显示了
小明:老湿!你这个骗子!
文件的编码
根据编码的不同,可以将文件分为文本字符和二进制字节
文本字符,如汉字、英文字母、数字、标点等,字符是为了显示
二进制字节是计算机存储的形式,在计算机中,任何数据都是01串构成的二进制字节
当我们打开文本,看到的是字符,最终保存时候存储的是二进制字节
文本字符的编码可以在win自带的记事本保存时选择各种编码
这里不详细讲解这些编码方式,如果有兴趣,可以自行摆渡!
因为我们使用的是Python3.X版本,在这个版本中,文件默认的编码方式就是utf-8
文本字符的常用的编码有ASCII和Unicode
值得注意的是,在Python3.X中,字符串等所有的文本字符使用的是unicode编码,可以使用encode()进行编码为utf-8
使用decode()可以将utf-8文件解码为文本字符
相互转换如图所示:
我们在Python中看看具体例子:
这里将文本字符中的字符串编码为默认的utf-8文件
当然,除了utf-8编码,还有很多其他编码,比如gbk编码
我们将utf-8解码回来
但是,如果我们将编码出的utf-8使用gbk解码,则会报错
从错误原因看出,某位置的内容不能被解码出来
想想原因,可以这样理解
一句中文,可以翻译为英文,也可以翻译为韩文
而只懂中文和英文的翻译A可以将中文翻译(编码)为英文,也可以将英文翻译(解码)为中文
如果想要让翻译A去将韩文翻译(解码)为中文,他不懂韩文,做不到啊!
而不同的编码解码就像这里的各种国家语言相互翻译
我们继续看看:
我们将gbk编码后的内容解码
报错了!因为我们解码没加参数,默认的是用utf-8解码
所以,我们得用gbk解码:
用gbk编码的内容当然不能用utf-8解码咯~
所以总结一下,utf-8编码出的内容只能用utf-8解码,gbk编码的内容只能用gbk解码!
注意到编码后的内容像个字符串,在字符串前面有个b,这个b表示的是二进制
也印证了字符编码后转为二进制字节
此时再来看一下这个图,是不是更清晰了
我们可以通过之前学的type()函数查看内容的状态
编码前的字符串显示为str字符串类型
编码后的字符串显示为bytes字节类型
如果你熟悉网络爬虫,遇到的最麻烦的问题之一就是编码问题,你对这种编码解码问题一定很熟悉吧,哈哈
6
文件的写入
之前讲过了文件打开创建和关闭,我们接着来谈谈文件写入
之前我们说了使用open()加上文件的绝对路径或者相对路径可以打开文件
这里我们讲一个更简单的方法
我们导入os模块
os模块是和操作系统相关的模块
在Python中这样操作:
这段代码指出了当前的工作目录
我们在学习资料.txt中加入如下内容,并且保存
我们在Python中打开这个文件:
因为之前指出了当前目录,所以可以给出相对路径即可(学习资料.txt在当前的工作路径)
我们使用read()方法可以读取文本内容
我们还可以使用write()方法写入内容:
报错啦!这不科学啊!小明,你来解释一下!
小明:老湿,是不是你的文本保存了什么不健康的信息?
小明,你不要把自己的经历经验强加给别人!
小红:老师,上节课说过,默认的打开模式是 r (只读),所以不能写入.
嗯,小红说的对,我们修改一下,首先关闭文档
此时我们打开该txt:
内容已经写进去了!
我们在Python中读出来:
如果再次读取呢?
发现读出来的内容为空!
解释一下,这里的read()方法相当于读取全部内容,如果读完内容,再次读取时候,书签已经在文章末尾,再次往后读当然没有内容啦~
如果我只想读取一行呢?
文本一共两行,如果读取完最后一行,再次读取和上面的read()一样,当然没内容啦~
如果我想读取多行呢?
小红:老师,可以使用循环!
很好,我们试试!
可是为什么只有第二句被读出来了呢?
因为while中的判断已经执行了一次readline()
而在print()中的readline()执行读出的是第二句
当然,我们可以换成for循环:
下课
人生苦短,我选Python
未完待续,连载中.....
今日作业:
自己用Python创建一个文件,写一首诗并且读出来
(阿喂!是用Python读,不是让你用嘴读!)
好啦,这期的分享先到这里,大家可以按照上面的详细步骤进行练习,入门部分已经学完大部分啦!加油,我们下周五不见不散~
文章来源:Python爱好者社区
文章编辑:小柳
往期文章:
技术 | Python从零开始系列连载(十三)
技术 | Python从零开始系列连载(十二)
技术 | Python从零开始系列连载(十一)
技术 | Python从零开始系列连载(十)
技术 | Python从零开始系列连载(九)
技术 | Python从零开始系列连载(八)
技术 | Python从零开始系列连载(七)
技术 | Python从零开始系列连载(六)
技术 | Python从零开始系列连载(五)
技术 | Python从零开始系列连载(四)
技术 | Python从零开始系列连载(三)
技术 | Python从零开始系列连载(二)
技术 | Python从零开始系列连载(一)