技术 | Python从零开始系列连载(十四)

导读为了解答大家初学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 盘并没有这个路径

小明:老湿!说好的看图啊!!

好吧,我们看看这张图的内容

我们需要导入一个模块来针对图片做处理:

我们运行完会弹出一个窗口,图片内容显示了

小明:老湿!你这个骗子!

5

文件的编码

根据编码的不同,可以将文件分为文本字符二进制字节

文本字符,如汉字、英文字母、数字、标点等,字符是为了显示

二进制字节是计算机存储的形式,在计算机中,任何数据都是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从零开始系列连载(一)

原文发布于微信公众号 - 灯塔大数据(DTbigdata)

原文发表时间:2018-04-27

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏腾讯Bugly的专栏

Redex 初探与 Interdex:Andorid 冷启动优化

导语 早在去年10月份,facebook就发布了介绍redex的文章,这个据说可以直接对apk做处理,既提高启动性能,又可减少安装包的利器让安卓开发者们都心动不...

6006
来自专栏机器学习算法与Python学习

干货 | Python 爬虫的工具列表大全

源 | 伯乐头条 | 小象 这个列表包含与网页抓取和数据处理的Python库。 网络 通用 urllib -网络库(stdlib)。 requests -网络...

3369
来自专栏技术博文

php性能监测模块XHProf

一,什么是XHProf XHProf是一个分层PHP性能分析工具。它报告函数级别的请求次数和各种指标,包括阻塞时间,CPU时间和内存使用情况。一个函数的开销,可...

3826
来自专栏拂晓风起

node.js WebService异常处理(domain)以及利用domain实现request生命周期的全局变量

1663
来自专栏编程

一行 Python 代码实现并行

译者:caspar 译文:https://segmentfault.com/a/1190000000414339 原文:https://medium.com/b...

2679
来自专栏云加头条

Redis 设计思路学习与总结

下半年利用空余时间研究和分析了部分Redis源码,本文从网络模型、数据结构和内存管理、持久化和多机协作四个角度对redis的设计思路进行了分析,若有不正确之处,...

10.9K6
来自专栏hotqin888的专栏

HydroCMS规范、图集查询系统设计

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/hotqin888/article/det...

1592
来自专栏月色的自留地

AngularJS2+调用原有的js脚本(AngularJS脚本跟本地原有脚本之间的关系)

1826
来自专栏DeveWork

WordPress删除头部wp_head()多余代码

如果你有查看过你的WordPress博客的“查看源代码”的话,你会发现头部的html代码非常多,而且是密密麻麻,有些像meta name="generator"...

8997
来自专栏杨建荣的学习笔记

初探Redis

大概在2010年的时候,有一次和一个同事聊天,那个时候知道了Redis,对于技术的追随至今,还没有下载一个Redis版本玩玩, 只有1万多行代码,以性...

4449

扫码关注云+社区

领取腾讯云代金券