文件读写操作一种基本操作,但是里面也存在很多需要注意的问题,例如字符编码、内存缓冲、指针位置等等。如果忽视这些问题就会引起很多不必要的麻烦。简单来说,文件的读写分为几个过程:

  1. 打开文件,并定义操作文件的方式(读、写or读写)
  2. 通过句柄对文件进行操作
  3. 关闭文件

打开文件的模式通常有以下几种:

  • r,只读模式(默认)
  • w,只写模式(不可读,通常用次方式创造一个新文件)
  • a,追加模式(可读;不存在就会创建,存在会追加)
  • 同时还存在,r+(指针位置),w+,a+,同时也存在rb,wb,ab代表处理二进制文件

文件的指针问题:

首先,打开一个文件,如下:

 漂泊在无尽的夜
遭受了无数的欺骗
冠冕堂皇的借口它只是你的诡辩
我心中有梦对你谈的利弊根本不屑
因为
前方的路还很远
不能局限在一个焦点
如果你眼光狭隘不懂蜕变,怎能看到我的心里面
我渴望的不是稳定、数十年磨一剑
我想要出去闯、迎接创新不断改变
希望你们能发现这世界的真善美
别再心机boy为了利益像个鬼
就算现在你能将我击退
待我卷土重来东山再起让你后悔

此文件编码是gbk模式的,所以打开文件时,要说明encoding='utf-8’,才能正确打开文件。

  • 当我们对一个文件进行只读操作时,指针的起始位置都会在文件的起始位置,但是注意一个问题,当使用seek()切换指针位置的时候,指针偏移的量是代表的字节,所以,如果以rb的形式打开,就不会报错,但是如果以uft-8的形式打开,除非是seek()的字节是三的倍数,否则就会报错(因为utf8中一个汉字代表三个字节)。
with open('file_wr.text','r',encoding='utf-8') as f:
f.seek(3)
print(f.readline())
result:
泊在无尽的夜

with open('file_wr.text','r',encoding='utf-8') as f:
f.seek(4)
print(f.readline())
result:
Traceback (most recent call last):
File "D:/pytwice/day1/homework_for_day1/文件读写.py", line 5, in <module>
print(f.readline())
File "C:\Users\z00428606\AppData\Local\Programs\Python\Python36\lib\codecs.py", line 321, in decode
(result, consumed) = self._buffer_decode(data, self.errors, final)
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xb3 in position 0: invalid start byte
  • 当我们对文件进行写操作的时候,无论如何偏移指针,就相当于对一个空文件从零开始进行写操作。
  • 当我们对文件进行r+操作的时候,可以认为有两个指针,一个是读指针,一个是写指针,读指针和只读模式一样,写指针则是在文件的末尾进行追加操作。
  • 对于w+......和w感觉没什么区别,读也读不出来......忘记他吧!

还有一个很重要的事情:flush。

我们进行文件读写操作时,写东西进去的时候,数据首先会进入内存缓冲区,然后再存到硬盘上,但是,存入内存缓冲区的文件不会一收到数据就发给硬盘,这样效率太低了,浪费资源。所以,一般情况下,都是等待内存缓冲区存好足够多的数据的时候,才会统一存到硬盘上面。这种情况下,就很大程度的节约了资源。但是,在某些特殊场景下,这种方式存在重大的安全隐患,比如突然断电、死机等等意外情况都会导致内存缓冲区的数据清空,在一些特殊的行业(金融、银行等)就会存在很大的风险(你刚存完钱的时候ATM机后台断电了,你找妈妈哭去!)。所以,有一种方法可以实现,及时刷新,发一条数据,内存收到,就会立马存到硬盘上。就是flush功能。

# Author:Zhang Zhao

with open('file_wr.text','w',encoding='utf-8') as f:
f.write('zz')
f.flush()

看看就好!

忘记一个!!tell功能,很简单,就是显示指针的位置:

# Author:Zhang Zhao

with open('file_wr.text','r+',encoding='utf-8') as f:
f.seek(6)
print(f.tell()) result:6

python里文件读写操作的更多相关文章

  1. 【Python】文件读写操作

    Python的文件读写有点类似php的文件读写.php的文件读写已经在<[php]让记事本成为你调控变量的控制台>(点击打开链接)说过了,以下用一个小样例说明Python的文件读写. 在F ...

  2. python的文件读写操作

    文件读写 本文转自廖雪峰老师的教程https://www.liaoxuefeng.com/wiki/1016959663602400/1017607179232640 读写文件是最常见的IO操作.Py ...

  3. python之文件读写操作笔记

    对不同类的文件操作,需要调用相关的库文件,一般情况下,可以选择建立:写文件函数和读文件函数.在写文件与读文件函数中 我们可以采用:with  open('文件名','w', encoding='utf ...

  4. python进阶--文件读写操作

    Python读写文件 1. open 使用open打开文件后一定要记得调用 文件对象的close()方法.比如可以用try --finally语句来确保最后能关闭文件. >>>f1 ...

  5. python之文件读写操作(r/r+/rb/w/w+/wb/a/a+/ab)的作用

    'r':只读.该文件必须已存在. 'r+':可读可写.该文件必须已存在,写为追加在文件内容末尾. 'rb':表示以二进制方式读取文件.该文件必须已存在. 'w':只写.打开即默认创建一个新文件,如果文 ...

  6. python 文件读写操作(24)

    以前的代码都是直接将数据输出到控制台,实际上我们也可以通过读/写文件的方式读取/输出到磁盘文件中,文件读写简称I/O操作.文件I/O操作一共分为四部分:打开(open)/读取(read)/写入(wri ...

  7. python(三)一个文件读写操作的小程序

    我们要实现一个文件读写操作的小程序 首先我们有一个文件 我们要以"============"为界限,每一个角色分割成一个独立的txt文件,按照分割线走的话是分成 xiaoNa_1. ...

  8. c语言文件读写操作总结

    C语言文件读写操作总结 C语言文件操作 一.标准文件的读写 1.文件的打开 fopen() 文件的打开操作表示将给用户指定的文件在内存分配一个FILE结构区,并将该结构的指针返回给用户程序,以后用户程 ...

  9. Python之文件读写

    本节内容: I/O操作概述 文件读写实现原理与操作步骤 文件打开模式 Python文件操作步骤示例 Python文件读取相关方法 文件读写与字符编码 一.I/O操作概述 I/O在计算机中是指Input ...

随机推荐

  1. H5的Web Audio Api

    概述 研究Web Audio Api的主要原因是:工作中需要在ios中实现声音的淡出效果,主要是通过setInterval来改audio标签的volume属性实现的,但是ios上面volume属性是只 ...

  2. Core 接口发布报错

    An error occurred while starting the application 提示:启动应用程序时发生错误 这个错误在Startup启动项里面 要找具体的报错位置 如下 这样就可以 ...

  3. 【云服务器部署】---Linux下安装MySQL

    [云服务器部署]---Linux下安装MySQL 有关如何阿里云ECS建网站,推荐一片文章,我是是通过这篇文章安装tomcat和jdk的 网址:阿里云ECS建网站(建站)超详细全套完整图文教程! 注意 ...

  4. rest-framework之权限组件

    权限 权限 作用 : 校验用户是否有权限访问 检测权限肯定是在用户认证通过之后,所有可以直接在request中取出用户做判断 先定义一个类,继承 BasePermission. from rest_f ...

  5. 课程回顾-Convolutional Neural Networks

    为什么卷积层计算量更低paddingStrided convolution多维卷积LeNet 参数卷积网络的好处参数共享稀疏连接经典网络实现LeNet-5AlexNetVGGResNet残差块iden ...

  6. 剑指offer例题分享--8

    前言:继续分享,加油! 面试题44: 代码如下: #include<iostream> #include<stdlib.h> using namespace std; int ...

  7. HashMap source code view(1)

    前言 HashMap source code view 类注释 Hash table based implementation of the Map interface. This implement ...

  8. javaweb之Filter过滤器详解

    快速入门 1.新建一个类,实现Filter接口 2.实现doFilter()方法,打印一句话,来证明能够进行拦截 3.在web.xml中进行配置(参照Servlet配置) 4.访问一个页面,看看能不能 ...

  9. Unity UI性能优化技巧

    本文将介绍一些提升Unity UI性能的技巧.更多优化技巧,可以观看Unity工程师Ian Dundore在Unite Europe 2017的演讲<使用Unity性能提升技巧>. 1.划 ...

  10. OJ:析构函数实现多态

    Description 下面程序的输出结果是: destructor B destructor A 请完整写出 class A. 限制条件:不得为 class A 编写构造函数. #include & ...