如何学python 第十九课 文件操作

今天我们来说说文件操作。文件操作在程序编写里有着举足轻重的作用。文件操作,主要包含文件的输入和输出。学会了文件操作,就可以写出更符合实际需求的脚本。

我会先介绍两种主要的I/O模式,然后介绍一下文件的手动opening和closing。最后,介绍更加自动化的操作方式。

两种主要I/O操作

有好多方式进行文件I/O操作。不过,最常使用的还是其中的两种。一种是读文件(‘r’),另一种是写文件(‘w’)。这两个操作的含义就是字面意思,从文件读数据和向文件写数据。

注意

标准的写操作会把文件覆盖(这意味着原有的文件内容会丢失),我们在后面的文章里会介绍如何做到这一点。

手动文件I/O操作

当我们进行文件I/O操作的时候,最好别用这种方式进行文件操作。举例来说,错误的关闭文件可能会导致一些严重的错误。虽然这不是推荐的操作,但是却很适合用来入门。

我们首先演示写文件。(此演示在linux下进行)首先创建一个叫做file的文件,然后在里面写上(只是用文本编辑器打开和写入)”Hello,Null Byte!”.

现在我们有了个文件。在进行文件写操作的时候,首先要在python里打开这个文件。这个过程会建立一个对象,所以我们需要用一个变量把这个对象存进去。在例子中,我们用变量‘file’来存贮这个对象。

当我们打开文件的时候,需要使用open()函数,并对传入文件路径和要进行什么样的文件操作。看例子:

我们此时已经通过只读方式打开了文件。现在来通过打印变量file的内容来看看到底读到了什么:

我们可以看到除了读到文件内容之外,还有一行空白。这其实是换行符\n。现在我们成功的读到了文件,一定一定要记得把文件关上。如果不关闭文件,就会导致一些错误,文件也可能会被损坏。我们可以用.close()方法来关闭文件对象。

现在,我们已经成功的打开、读、关闭了文件。下面来试试写文件。

写文件只要把open()的第二个参数换成’w’就可以了。向文件‘file’中写入”Hello,world!\n”:

记得手动加上\n,然后是文件的关闭操作。现在再看看文件里的内容:

好了,这就是手动操作文件的全部内容。

自动文件I/O操作

‘自动’,意味着不再需要手动打开或者关闭文件。我们可以用with关键字和as关键字来打开和关闭文件。这么做的格式是

with open(‘文件路径’,‘操作方式’) as 存储文件的变量名

你可能注意到提示符的样子从>>>变成了… 这是因为使用with和as关键字的时候,所有的io操作都必须在with/as的body部分里。

这样就不用手动关闭文件了。下面演示一下写操作:

现在来看看文件写进去了没:

下面继续open函数的其他参数。不同的参数会以不同的方式操作文件。如果你的学习能力够强,就应该在看到这个函数的第一时间去了解它的各个参数的含义,传入不同参数的作用、返回值等等情况。了解了这些基本信息,使用起来也就没什么问题了。在上一篇介绍文件操作的文章里,我们给出了很多操作文件的方式,但是没有给出具体的解释,只是让有兴趣的同学自己试试看。这节来详细介绍一下上次没介绍的几种文件操作模式。

r+方式:这种方式既可以读文件又可以写文件,但是是分开单独进行的。

rb方式:这种方式以二进制方式读文件。

wb方式:这种方式以二进制方式写文件。

在演示文件操作之前,需要先创建一个文件:

额外提一嘴,这里的环境依旧是kali。我们先用touch命令创建了一个叫做test的文件,然后有用cat 命令向文件写入了一些内容。cat << EOF > test这行命令的含义是,打开test文件,向test文件内写入接下来你输入的内容(可以是多行),并在遇到’EOF’这个东西的时候保存内容并关闭test文件。注意,这个’EOF’可以是其他任何的东西,这里的eof虽然也意味着end of file,却并不是我们传统意义上的那个真正的文件结束标记。另外,这个标记不会被保存到文件中。好了,书归正传,继续说python下的文件操作方式。

r+模式

r+模式也可以叫做’拓展读模式’。我们就用之前说的as with的方法来演示。

这里用到了一个新的方法,readlines().read,读。lines,行,而且是个复数形式,多行。其实从字面意思来看就可以知道这是什么意思。readlines可以按行读取文件,并且以行为单位,返回一个list对象。

print一下通过读文件读到的内容:

再看看写文件是不是写进去了:

二进制读/写模式

以二进制的方式读取文件和写入文件,在日常编程中 并不是很常见。然而,在某些特殊情况下(比如加密/解密等),二进制读写是非常有用的。

为了举例子,我们先创建一个目标文件。事实上,任意一个其他的文件也可以被拿来做实验,无论你的系统是什么。这里,我简单的创建一个可执行文件,然后用这个可执行文件做实验:

由于这是一个python文章,所以关于文件创建过程,我就不多说什么了。

然后,使用rb模式读文件->把读到的东西放进test变量里->输出test变量:

执行print之后,我们会发现输出了一大堆莫名其妙根本看不懂的东西。没关系,我们不懂无所谓,系统懂就行了。。。

输出的内容:

我们唯一能看懂的基本上就是那句Hello world了。

也许你觉得这个东西没有卵用,其实还是有点用的。那我举个例子好了。不知道大家还记不记得许多年前有个工具叫灰鸽子,当时江湖上出现了各种各样xxx专版灰鸽子,看起来屌屌的,好像真的是重新开发版一样。

然而并不是这样的。

事实上相当多的改版灰鸽子都是用类似的方式,查字段,改字段,然后就没了。甚至连重新编译都没有。。。。

当然了,除了用来装逼,它还有很多别的用处。这节课我们姑且讲基础,不说太深入。但是千万别觉得没有卵用——把枪交给一个不会开枪的人,犹如一堆废铁。能怪枪没有卵用吗?并不能。

好了,开始说二进制写。

使用二进制写文件->打开新创建的文件test2->把刚才读出来的test写到test2里。

改权限,执行(因为是linux下所以需要改一下权限):

可以看到,test2和test完全一样。

总结

今天说的这几样里,平时使用频率最高的就是r+模式了。在进行大量的读写文件操作的时候,这个模式相当的有用。后面那两种虽然不常用,但却也有其无可替代的地方。当然,更可能的情况是,当你在别人写的代码里看到了这个东

原文发布于微信公众号 - 玄魂工作室(xuanhun521)

原文发表时间:2016-08-19

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

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏丑胖侠

Zookeeper开源客户端Curator之基本功能讲解

简介 Curator是Netflix公司开源的一套Zookeeper客户端框架。了解过Zookeeper原生API都会清楚其复杂度。Curator帮助我们在其基...

3435
来自专栏Linux驱动

13.Linux键盘按键驱动 (详解)

在上一节分析输入子系统内的intput_handler软件处理部分后,接下来我们开始写input_dev驱动 本节目标:        实现键盘驱动,让开发板的...

3755
来自专栏后端技术探索

nginx入门到入门

用户访问反向代理服务器。但是用户不知道访问的是反向代理服务器多个站点中的哪一个站点。对服务器服务。

882
来自专栏开发与安全

进程控制块PCB结构 task_struct 描述

注:本分类下文章大多整理自《深入分析linux内核源代码》一书,另有参考其他一些资料如《linux内核完全剖析》、《linux c 编程一站式学习》等,只是为了...

2728
来自专栏格子的个人博客

Mysql 8.0.12压缩包安装教程

以前都是解压缩安装5.7版本的mysql,刚好最近换了电脑需要重装mysql,就去官网下载了新版本8.0.12,整理一下安装步骤。一来备忘,二来如果刚好也能给需...

1902
来自专栏用户2442861的专栏

redis 学习指南

http://www.cnblogs.com/hoojo/p/4466024.html

1991
来自专栏c#开发者

消息队列(Message Queue)简介及其使用

消息队列(Message Queue)简介及其使用 利用 MSMQ(Microsoft Message Queue),应用程序开发人员可以通过发送和接收消息方...

4928
来自专栏java一日一条

在 Java 中运用动态挂载实现 Bug 的热修复

大多数 JVM 具备 Java 的 HotSwap 特性,大部分开发者认为它仅仅是一个调试工具。利用这一特性,有可能在不重启 Java 进程条件下,改变 Jav...

1552
来自专栏PhpZendo

PHP 文件系统完全指南

今天我们将开启一个新的探索旅程,深入到 PHP 文件系统中,系统的学习和掌握 PHP 文件系统的基本使用。

1853
来自专栏陈满iOS

iOS下载报错:App Transport Security has blocked a cleartext HTTP

以上方法虽然解决了HTTP不能正常使用的问题,但是苹果提供的安全保障也被关闭了,对于不支持HTTPS协议的网站,可以考虑白名单:

4044

扫码关注云+社区

领取腾讯云代金券